grep的贪婪行为

4

我曾认为在正则表达式中,“贪婪性”仅适用于量词而非整个匹配过程。但是,我发现

grep -E --color=auto 'a+(ab)?' <(printf "aab")

返回值为 aab 而不是 aab。

sed 也是相同的情况。 另一方面,在 pcregrep 和其他工具中,确实是量词贪婪。 这是 grep 的特定行为吗?

N.B. 我检查了 BSD grep 2.5.1-FreeBSD 和 GNU grep 3.1 两个版本。


1
我现在更好地理解了问题,echo 'aab' | grep -P 'a+(ab)?' 会高亮显示 aa,而 echo 'aab' | grep -E 'a+(ab)?' 则会高亮显示 aab,这意味着可选的 ab 也被匹配了,即使它不是必需的。我认为这是因为最长匹配原则。例如,echo 'aab' | grep -E 'a+|a+b' 会高亮显示 aab,因为这是最长的匹配,而 echo 'aab' | grep -P 'a+|a+b' 会高亮显示 aa,因为在 PCRE 中,从同一位置开始的匹配的替代优先级是从左到右的。 - Sundeep
是的,我曾经在某个地方读到过最长匹配。但它与“贪婪量词”相冲突。我没有意识到这是 POSIX 正则表达式和其他一些正则表达式不同的另一点。 - Joseph Stack
1个回答

5

术语matched的描述中,POSIX规定:

查找匹配序列从字符串开头开始,当找到第一个与表达式匹配的序列时停止,其中“第一个”被定义为“在字符串中最早开始的”。如果模式允许可变数量的匹配字符,因此在该点有多个这样的序列,则匹配最长的序列。

这句话清楚地回答了你的问题。字符串aab包含两个以相同位置开始的子字符串,它们与ERE a+(ab)?匹配;这些是aaaab。后者是最长的,因此它被匹配。


那么,在正则表达式中,量词默认为贪婪的这个说法并不适用于POSIX正则表达式,而只适用于基于PCRE的工具? - Joseph Stack
@JosephStack 我对 PCRE 一无所知,但很可能是的。 - oguz ismail
1
很多地方我读到的“量词是贪婪的”并没有明确说明它适用于哪种正则表达式语言...谢谢。 - Joseph Stack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接