gpt4 book ai didi

java - 正则表达式为什么当这里有两个组时负前瞻不起作用

转载 作者:行者123 更新时间:2023-11-29 05:36:28 24 4
gpt4 key购买 nike

当我尝试这个正则表达式时

\"(\S\S+)\"(?!;c)

在这个字符串上 "MM:";d 它和我想要的一样匹配

在这个字符串 "MM:";c 上,它没有按预期匹配。

但是当我添加第二组时,通过将分号移到该组内并使用 | 使其成为可选

\"(\S\S+)\"(;|)(?!c)

对于这个字符串 "MM:";c 当我预期它不像以前那样匹配时它出现了。

我在 Java 上试过这个,然后在 Javascript 上使用 Regex 工具调试:

This link contains a snippet of the above

我做错了什么?

注意 |所以分号不是必需的。此外,在示例中我放置了 c,它只是示例中单词的替代,这就是为什么我使用负先行。

在遵循 Holgers 对使用所有格量词的回应之后,

\"(\S\S+)\";?+(?!c)

成功了,here is a link to it on RegexPlanet

最佳答案

我相信正则表达式会尽其所能找到匹配项;因为你的表达式说分号可以是可选的,所以它发现它可以匹配整个表达式(因为如果分号没有被第一组使用,它就会成为否定前瞻的“不匹配”。这与正则表达式工作的递归方式:它一直试图找到一个匹配...

换句话说,这个过程是这样的:

MM:" - matched
(;|) - try semicolon? matched
(?!c) - oops - negative lookahead fails. No match. Go back
(;|) - try nothing. We still have ';c' left to match
(?!c) - negative lookahead not matched. We have a match

更新(基于您的评论)。以下代码可能效果更好:

\"(\S\S+)\"(;|)((?!c)|(?!;c))

Regular expression visualization

Debuggex Demo

关于java - 正则表达式为什么当这里有两个组时负前瞻不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19394171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com