鱼C论坛

 找回密码
 立即注册
查看: 1981|回复: 2

[已解决]正则表达式(?=...)和(?=...)

[复制链接]
发表于 2023-8-15 10:26:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
字符串:A12:L99
为什么用正则:(?=A)\d+,没法匹配到12

正则:(?!A)\d+,却可以匹配到12,99
最佳答案
2023-8-15 10:27:12
正则表达式中的 (?=...) 和 (?!...) 是正向肯定预查和正向否定预查。它们用于在匹配字符串时进行先行断言。

(?=A)\d+ 使用了正向肯定预查,表示匹配一个数字,但该数字后面必须紧跟着字母"A"。在字符串"A12:L99"中,虽然数字12之前是字母"A",但是预查只是检查后面的字符,所以无法匹配到12。

(?!A)\d+ 使用了正向否定预查,表示匹配一个数字,但该数字后面不能紧跟着字母"A"。在字符串"A12:L99"中,数字12之后是冒号":"而不是字母"A",所以可以匹配到12。

需要注意的是,正则表达式中的预查只是进行先行断言,不会消耗字符,所以在匹配过程中,预查部分不会包含在最终的匹配结果中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-15 10:27:05 | 显示全部楼层
正则表达式中 (?=...) 是正向预查(Positive Lookahead),表示后面必须满足某个条件才匹配成功,而 (?!) 是负向预查(Negative Lookahead),表示后面不能满足某个条件才匹配成功。在你提供的例子中,我们来逐个解释这两个正则表达式的含义和匹配结果:

1. (?=A)\d+:这个正则表达式使用了正向预查,即要求后面的字符是 "A" 才会匹配成功。而 \d+ 表示匹配一个或多个数字。因此,整个正则表达式 (?=A)\d+ 的含义是:匹配一个或多个数字,但它们的前面必须是 "A"。在字符串 "A12:L99" 中,"A" 后面紧跟着数字 "12",所以这个正则表达式可以成功匹配到数字 "12"。

2. (?!A)\d+:这个正则表达式使用了负向预查,即要求后面的字符不是 "A" 才会匹配成功。同样地,\d+ 表示匹配一个或多个数字。因此,整个正则表达式 (?!A)\d+ 的含义是:匹配一个或多个数字,但它们的前面不能是 "A"。在字符串 "A12:L99" 中,"A" 后面的 "12" 符合不是 "A" 的条件,所以这个正则表达式可以成功匹配到数字 "12"。同理,它也可以匹配到 "99",因为 "99" 不满足前面不能是 "A" 的条件。

综上所述,使用正则表达式 (?=A)\d+ 可以匹配到 "A" 后面的数字 "12",而使用正则表达式 (?!A)\d+ 可以匹配到任何不以 "A" 开头的数字。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-15 10:27:12 | 显示全部楼层    本楼为最佳答案   
正则表达式中的 (?=...) 和 (?!...) 是正向肯定预查和正向否定预查。它们用于在匹配字符串时进行先行断言。

(?=A)\d+ 使用了正向肯定预查,表示匹配一个数字,但该数字后面必须紧跟着字母"A"。在字符串"A12:L99"中,虽然数字12之前是字母"A",但是预查只是检查后面的字符,所以无法匹配到12。

(?!A)\d+ 使用了正向否定预查,表示匹配一个数字,但该数字后面不能紧跟着字母"A"。在字符串"A12:L99"中,数字12之后是冒号":"而不是字母"A",所以可以匹配到12。

需要注意的是,正则表达式中的预查只是进行先行断言,不会消耗字符,所以在匹配过程中,预查部分不会包含在最终的匹配结果中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 10:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表