【发布时间】:2016-12-06 01:52:34
【问题描述】:
我发现非贪婪的正则表达式匹配只有在锚定到前面而不是末尾时才会变得非贪婪:
$ echo abcabcabc | perl -ne 'print $1 if /^(a.*c)/'
abcabcabc
# OK, greedy match
$ echo abcabcabc | perl -ne 'print $1 if /^(a.*?c)/'
abc
# YES! non-greedy match
现在看看这个,当锚定到最后时:
$ echo abcabcabc | perl -ne 'print $1 if /(a.*c)$/'
abcabcabc
# OK, greedy match
$ echo abcabcabc | perl -ne 'print $1 if /(a.*?c)$/'
abcabcabc
# what, non-greedy become greedy?
这是为什么呢?怎么不像以前那样打印abc?
(问题是在我的 Go 代码中发现的,但为了简单起见,在 Perl 中进行了说明)。
【问题讨论】:
-
/(a.c*?)$/匹配 'abcabcabc' 中的最后一个 'abc'。由于您要锚定到最后,因此 c 应该是非贪婪的。 -
@AdityaJ.,不,你改变了“算法”。对于您的“解决方案”,即使没有
*?,即/(a.c)$/,它仍然可以工作。不过感谢您的尝试。 -
使用
.*?,正则表达式引擎开始匹配量词允许的最小字符数——零。然后引擎前进并尝试下一个令牌。这失败了,所以引擎回溯并扩展它的匹配。这个过程不断重复——正则表达式引擎前进、失败、回溯、再次扩展匹配、前进、失败……这是否定/a[^a]*c$/的例子