我发现非贪婪正则表达式只有在锚定到前面时才变得非贪婪,而不是锚定到末尾:
$ 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 设为非贪婪模式。 - Aditya J.*?
,也就是/(a.c)$/
,它仍然可以工作。但还是谢谢你尝试了。 - xpt.*?
正则表达式引擎开始匹配量词允许的最小字符数,这个数字是 零。然后引擎继续前进并尝试下一个标记。这次匹配失败了,所以引擎回溯并扩展其匹配。这个过程不断重复——正则表达式引擎前进、失败、回溯、再次扩展其匹配、前进、失败...... 这是否定/a[^a]*c$/
的情况。 - hwnd