据我所知,非贪婪匹配不是基本正则表达式(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
的一个未记录的特性,还是我对输出的误解?
双重量词只是一个语法错误,可能会导致错误消息或未定义的行为。如果您得到一个错误消息,这可能会更好。
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+的一部分。按照上面链接的问题的例子,我可以这样修复它: 它起作用了,而且做的正是我想要的。在我的真实语言中,我有数百个关键字列表,用于不同类型的句子,所以如果我尝试这种方法,我肯定会犯错误,当我在我的语言中创建新的结构时,我必须返回并编辑所有其他结构。 最好是从列表中进行非贪婪匹配