我对正则表达式和贪婪与懒惰有点困惑。 它真的非常简单,感觉我错过了一些明显的东西。

我尽可能地简化了我的问题以便说清楚。 请考虑以下字符串和正则表达式模式。

string:
aaxxxb

pattern:
(?<=a)(.*?)(?=b)

result:
axxx

what I expected:
xxx

这个结果是我期望使用的。*而不是。*?,我错过了什么?

显然,同样的事情,如果我使用。*?b给我aaxxxb。 为什么是这样? 不应该懒(比如。*?)尽可能少的字符返回?

===============>>#1 票数:6 已采纳

你错过了一个正则表达式引擎从左到右,逐个位置工作,并在当前位置找到匹配后立即成功的事实。

在您的示例中,模式成功的第一个位置是第二个“a”。

懒惰只在右侧起作用。

如果你想获得“xxx”,更好的方法是使用否定的字符类[^ab]*而不是.*?

注意:与主题不完全相关,但很有必要:DFA正则表达式引擎将尝试在交替的情况下获得最大的结果,NFA为您提供第一个成功的结果。

===============>>#2 票数:2

user1277327,模式的(?<=a)部分表示“前面有'a'”。 当正则表达式引擎在你的字符串aaxxxb上启动时,第一个“a”不能完成那个lookbehind的断言,但是第二个“a”就是这样。 很好,但引擎可以匹配“a”吗? 是的,你的。*中的点允许引擎匹配这个“a”。 懒惰的修饰符? 告诉点星只吃掉必要的字符,直到我们能够匹配接下来的字符。 接下来是前瞻断言下一个字符是“b”。 因此引擎会占用三个x字符。 总比赛是axxx。

如果你发现贪婪/懒惰令人困惑,你可能想看一下正则表达式贪婪的程度 随附的外观很有帮助

  ask by user1277327 translate from so

未解决问题?本站智能推荐: