非凡 发表于 2023-8-15 10:26:40

正则表达式(?=...)和(?=...)

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

正则:(?!A)\d+,却可以匹配到12,99

陶远航 发表于 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" 开头的数字。
如果问题已经解决,请设置最佳答案

isdkz 发表于 2023-8-15 10:27:12

正则表达式中的 (?=...) 和 (?!...) 是正向肯定预查和正向否定预查。它们用于在匹配字符串时进行先行断言。

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

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

需要注意的是,正则表达式中的预查只是进行先行断言,不会消耗字符,所以在匹配过程中,预查部分不会包含在最终的匹配结果中。
页: [1]
查看完整版本: 正则表达式(?=...)和(?=...)