【问题标题】:Greedy behaviour of grepgrep 的贪婪行为
【发布时间】:2020-03-26 23:56:39
【问题描述】:

我认为在正则表达式中,“贪婪”适用于量词而不是整体匹配。但是,我观察到

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

返回 aab 而不是 aab。

这同样适用于 sed。 另一方面,在 pcregrep 等工具中,真正贪婪的是量词。 这是 grep 的特定行为吗?

注意我检查了两个 grep (BSD grep) 2.5.1-FreeBSD 和 grep (GNU grep) 3.1

【问题讨论】:

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

标签: regex grep regex-greedy posix-ere


【解决方案1】:

the description of term matched 中,POSIX 声明

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

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

【讨论】:

  • 那么,正则表达式中量词默认为贪婪的声明不适用于 POSIX 正则表达式,而仅适用于基于 PCRE 的工具?
  • @JosephStack 我对 PCRE 一无所知,但可能是的
  • 谢谢。我读到“量词是贪婪的”的许多地方并没有明确它适用于什么正则表达式风格......
猜你喜欢
  • 2011-11-17
  • 2021-03-04
  • 2011-03-02
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
相关资源
最近更新 更多