首页 文章

与grep的非贪婪匹配

提问于
浏览
6

据我所知,非贪心匹配不是基本正则表达式(BRE)和扩展正则表达式(ERE)的一部分 . 但是, grep (BSD和GNU)的不同版本上的行为似乎暗示了其他方面 .

例如,我们来看下面的例子 . 我有一个字符串说:

string="hello_my_dear_polo"

使用GNU grep:

以下是从字符串中提取 hello 的几次尝试 .

BRE Attempt:

$ grep -o "hel.*\?o" <<< "$string"
hello_my_dear_polo

输出产生整个字符串,这表明非贪婪量词对BRE不起作用 . 请注意,我只是转义了 ? ,因为 * 并没有失去它的含义,也不需要转义 .

ERE Attempt:

$ grep -oE "hel.*?o" <<< "$string"
hello_my_dear_polo

启用 -E 选项也会产生相同的输出,表明非贪婪匹配不是ERE的一部分 . 由于我们使用ERE,因此不需要转义 .

PCRE Attempt:

$ grep -oP "hel.*?o" <<< "$string"
hello

为PCRE启用 -P 选项表明非贪婪量词是其中的一部分,因此我们得到 hello 的所需输出 . 由于我们使用PCRE,因此不需要转义 .

使用BSD grep:

以下是从字符串中提取 hello 的几次尝试 .

BRE Attempt:

$ grep -o "hel.*\?o" <<< "$string"

使用BRE我没有得到BSD grep 的输出 .

ERE Attempt:

$ grep -oE "hel.*?o" <<< "$string"
hello

启用 -E 选项后,我 surprised 我能够提取所需的输出 . 我的问题是我从这次尝试得到的输出 .

PCRE Attempt:

$ grep -oP "hel.*?o" <<< "$string"
usage: grep [-abcDEFGHhIiJLlmnOoPqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
    [-e pattern] [-f file] [--binary-files=value] [--color=when]
    [--context[=num]] [--directories=action] [--label] [--line-buffered]
    [--null] [pattern] [file ...]

使用 -P 选项给了我使用错误,这是预期的,因为 grep 的BSD选项不支持PCRE .

所以我的问题是为什么在BSD上使用ERE grep 使用非贪婪量词产生正确的输出,而不是使用GNU grep .

这是一个错误,BSD egrep 的未记录的功能还是我对输出的误解?

1 回答

  • 2

    双量词只是一个语法错误,可能导致错误消息或未定义的行为 . 如果您收到错误消息,可能会更好 .

    Perl对正则表达式后日期POSIX的扩展很大;在编写这些工具时,人们极不可能尝试将这种古怪的语法用于任何事情 . 贪婪匹配仅在20世纪90年代中期在Perl 5中引入 .

相关问题