我对正则表达式和贪婪与懒惰有点困惑。这真的非常简单,感觉就像我错过了一些明显的东西。
我已尽可能简化我的问题以使其清楚。考虑以下字符串和正则表达式模式。
string:
aaxxxb
pattern:
(?<=a)(.*?)(?=b)
result:
axxx
what I expected:
xxx
这个结果是我期望使用 .* 而不是 .*?,我错过了什么?
显然,如果我使用 a.*?b ,同样会得到 aaxxb。为什么是这样?惰性(如 .*?)不应该返回尽可能少的字符吗?
您忽略了这样一个事实:正则表达式引擎从左到右、逐个位置地工作,并且一旦在当前位置找到匹配项就会成功。
在您的示例中,模式成功的第一个位置是第二个“a”。
懒惰只在右侧起作用。
如果你想获取“xxx”,更好的方法是使用否定字符类[^ab]*
代替.*?
注意:与主题不完全相关,但很高兴知道:DFA 正则表达式引擎将尝试在交替的情况下获得最大结果,NFA 为您提供第一个成功的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)