gpt4 book ai didi

regex - 用grep进行非贪婪匹配

转载 作者:行者123 更新时间:2023-12-04 08:49:04 24 4
gpt4 key购买 nike

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

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

string="hello_my_dear_polo"

使用GNU grep:

以下是从字符串中提取 hello的一些尝试。

BRE尝试(失败) :
$ grep -o "hel.*\?o" <<< "$string"
hello_my_dear_polo

输出会产生整个字符串,这表明非贪婪量词不适用于BRE。注意,我只转义了 ?,因为 *不会失去它的含义,因此不需要转义。

ERE尝试(失败) :
$ grep -oE "hel.*?o" <<< "$string"
hello_my_dear_polo

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

PCRE尝试(成功) :
$ grep -oP "hel.*?o" <<< "$string"
hello

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

使用BSD的 grep:

这是从字符串中提取 hello的一些尝试。

BRE尝试(失败) :
$ grep -o "hel.*\?o" <<< "$string"

使用BRE我没有从BSD grep获得任何输出。

ERE尝试(成功) :
$ grep -oE "hel.*?o" <<< "$string"
hello

启用 -E选项后,我 感到惊讶,因为我能够提取所需的输出。 我的问题是我从这次尝试中获得的输出。

PCRE尝试(失败) :
$ 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 grep上使用ERE并通过使用非贪婪量词而不是GNU grep来产生正确的输出。

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

最佳答案

双重量词只是语法错误,可能会导致错误消息或未定义的行为。如果收到错误消息,可以说会更好。

Perl对正则表达式发布日期POSIX的扩展很大;在编写这些工具时,极不可能有人尝试对任何东西使用这种古怪的语法。贪婪匹配仅在1990年代中期才在Perl 5中引入。

关于regex - 用grep进行非贪婪匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23454172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com