(注意:不是Why can't you use repetition quantifiers in zero-width look behind assertions的重复;请看帖子结尾。)
我试图编写一个
因此,我尝试了这个负向回顾,并在regex101.com上进行了测试:
这会导致“AB”不匹配,这是好的,但“A B”会匹配,这不是我想要的。
我不确定为什么会这样。这与\s*匹配空字符串""有关,可以说在A和B之间有无限个\s*匹配。但为什么会影响“A B”而不是“AB”?
以下正则表达式是否正确解决了问题,如果是,它为什么能解决问题?
我试图编写一个
grep -P
(Perl)正则表达式,用于匹配B,当B不是在A之前—无论是否有中间空格。因此,我尝试了这个负向回顾,并在regex101.com上进行了测试:
(?<!A)\s*B
这会导致“AB”不匹配,这是好的,但“A B”会匹配,这不是我想要的。
我不确定为什么会这样。这与\s*匹配空字符串""有关,可以说在A和B之间有无限个\s*匹配。但为什么会影响“A B”而不是“AB”?
以下正则表达式是否正确解决了问题,如果是,它为什么能解决问题?
(?<![A\s])\s*B
我之前发布过这个问题,但被错误地标记为重复问题。我想要的可变长度部分是匹配的一部分,而不是负向回顾本身的一部分,因此这与其他问题非常不同。是的,我可以将 \s* 放在负向回顾中,但我没有这样做(并且这样做不受支持,正如其他问题所解释的那样)。此外,我特别想知道上面发布的备用正则表达式为什么起作用,因为我知道它有效,但我不确定为什么。其他问题没有帮助回答这个问题。
(?<![A\s])\s*B
这并不是一个好的做法。其中一个原因是回溯过程非常庞大。也许有一天你会更关心性能而不是实质。由于你正在使用 Perl,请利用它的动词。(?:A\s*B(*SKIP)(*FAIL)|B)
- user557597Regex1: (?<![A\s])\s*B 已完成迭代次数: 50 / 50 ( x 1000 ) 每次迭代找到的匹配项: 1 经过时间: 0.53 秒, 530.18 毫秒, 530185 微秒 Regex2: (?:A\s*B(*SKIP)(*FAIL)|B) 已完成迭代次数: 50 / 50 ( x 1000 ) 每次迭代找到的匹配项: 1 经过时间: 0.18 秒, 180.07 毫秒, 180073 微秒
- user557597[^A\s]\s*B
存在问题,而(?:^|[^A\s])\s*B
可以解决这个问题。 - std_answ