当前位置: 首页 > 知识库问答 >
问题:

与 grep 的非贪婪匹配

屈昊天
2023-03-14

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

举个例子,我们来看下面这个例子。我有一串话要说:

string="hello_my_dear_polo"

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

BRE尝试(失败):

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

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

尝试前(失败):

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

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

PCRE尝试(成功):

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

为PCRE启用< code>-P选项表明非贪婪量词是它的一部分,因此我们得到了< code>hello的期望输出。这里不需要转义,因为我们使用的是PCRE。

下面是从字符串中提取< code>hello的一些尝试。

BRE尝试(失败):

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

使用BRE,我没有从BSDgrep获得任何输出。

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。

所以我的问题是,为什么在BSDgrep上使用ERE会使用非贪婪量词而不是GNUgrep来产生正确的输出。

这是一个bug,BSD egrep的一个未记录的特性,还是我对输出的误解?

共有1个答案

劳嘉实
2023-03-14

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

Perl对regex的扩展大大晚于POSIX在编写这些工具的时候,不太可能有人试图将这种古怪的语法用于任何事情。贪婪匹配在20世纪90年代中期才在Perl 5中引入。

 类似资料:
  • 本文向大家介绍python re模块匹配贪婪和非贪婪模式详解,包括了python re模块匹配贪婪和非贪婪模式详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了python re模块匹配贪婪和非贪婪模式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python贪婪和非贪婪 正则表达式通常用于在文本中查找匹配的字符串。Pytho

  • 本文向大家介绍php正则表达式中贪婪与非贪婪介绍,包括了php正则表达式中贪婪与非贪婪介绍的使用技巧和注意事项,需要的朋友参考一下 一、贪婪与非贪婪 什么叫贪婪,比如说要从字符串中<td>面包一</td><td>面包二</td>吃面包,本来你只可以吃面包一,可是你贪心,于是就把第一个<td>到最后一个</td>里面的两个面包取出来了,你想多吃点,非贪婪也就是你不贪吃了,就只吃面包一。 我们来看看正

  • 基本上,我试图为lexer指定尝试匹配(LOWCHARHIGHCHAR)的非贪婪方式,因此它停止在关键字lookahead。到目前为止,我所读到的关于ANTLR lexer的内容是,应该有某种lexer规则的优先级。如果我在lexer语法中首先指定关键字lexer规则,那么后面的任何lexer规则都不能匹配所使用的字符。 经过一番搜索,我明白了这里的问题是它不能以正确的方式标记输入,因为例如对于输

  • 贪婪 vs 不贪婪 当重复一个正则表达式时,如用 a*,操作结果是尽可能多地匹配模式。当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号时这个事实经常困扰你。匹配单个 HTML 标志的模式不能正常工作,因为 .* 的本质是“贪婪”的 #!python >>> s = '<html><head><title>Title</title>' >>> len(s) 32 >>> print re.

  • 我需要关于非贪婪选项的正则表达式匹配的帮助。 匹配模式为: 要匹配的文本是: 我在上测试http://regexpal.com 此表达式匹配 ,没有成功。

  • 效果很好。但是我也想匹配包含关键字的句子,这些关键字不会被期望终止ID+块。例如 fist显示为,然后作为第一个ID+的一部分。按照上面链接的问题的例子,我可以这样修复它: 它起作用了,而且做的正是我想要的。在我的真实语言中,我有数百个关键字列表,用于不同类型的句子,所以如果我尝试这种方法,我肯定会犯错误,当我在我的语言中创建新的结构时,我必须返回并编辑所有其他结构。 最好是从列表中进行非贪婪匹配