我曾认为在正则表达式中,“贪婪性”仅适用于量词而非整个匹配过程。但是,我发现
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 两个版本。
我曾认为在正则表达式中,“贪婪性”仅适用于量词而非整个匹配过程。但是,我发现
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 两个版本。
在术语matched的描述中,POSIX规定:
查找匹配序列从字符串开头开始,当找到第一个与表达式匹配的序列时停止,其中“第一个”被定义为“在字符串中最早开始的”。如果模式允许可变数量的匹配字符,因此在该点有多个这样的序列,则匹配最长的序列。
这句话清楚地回答了你的问题。字符串aab
包含两个以相同位置开始的子字符串,它们与ERE a+(ab)?
匹配;这些是aa
和aab
。后者是最长的,因此它被匹配。
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