正则表达式中 + 的含义是啥?

Posted

技术标签:

【中文标题】正则表达式中 + 的含义是啥?【英文标题】:What is the meaning of + in a regex?正则表达式中 + 的含义是什么? 【发布时间】:2011-04-20 11:55:15 【问题描述】:

正则表达式中的加号是什么意思?

【问题讨论】:

你能发个样本吗? /s+a+m+p+l+e+/ ^^ 匹配 samplesampleesssaaaaaammmppplllllle,但不匹配 smple 【参考方案1】:

+ 实际上可以有两种含义,具体取决于上下文。

与提到的其他答案一样,+ 通常是 repetition 运算符,并导致前面的标记重复一次或多次。 a+在formal language theory中可以表示为aa*,也可以表示为a1,(最少匹配1次,最多匹配无限次)。


但是,+ 也可以使其他量词 possessive 如果它遵循重复运算符(即 ?+*+++<i>m</i>,<i>n</i>+)。所有格量词是一些正则表达式风格(PCRE、Java 和 JGsoft 引擎)的高级功能,它告诉引擎在匹配完成后不要回溯。

要了解其工作原理,我们需要了解正则表达式引擎的两个概念:贪婪回溯。贪婪意味着通常正则表达式会尝试使用尽可能多的字符。假设我们的模式是.*(dot 是正则表达式中的一个特殊结构,表示任何字符1;星号表示匹配零次或多次),并且你的目标是aaaaaaaab。整个字符串都会被消耗掉,因为整个字符串是满足模式的最长匹配。

但是,假设我们将模式更改为.*b。现在,当正则表达式引擎尝试匹配 aaaaaaaab 时,.* 将再次消耗整个字符串。但是,由于引擎将到达字符串的末尾并且模式尚未满足(.* 消耗了所有内容,但之后模式仍必须匹配 b),它将回溯 ,一次一个字符,并尝试匹配b。第一次回溯会使.*消耗aaaaaaaa,然后b可以消耗b,模式成功。

占有量词也是贪婪的,但如前所述,一旦它们返回匹配项,引擎就不能再回溯到那个点。因此,如果我们将模式更改为.*+b(所有格匹配任何字符零次或多次,后跟b),并尝试匹配aaaaaaaab.* 将再次消耗整个字符串,但随后因为它是所有格,所以回溯信息被丢弃,并且 b 无法匹配,因此模式失败。


1 在大多数引擎中,点不会匹配换行符,除非指定了/s(“singleline”或“dotall”)modifier。

【讨论】:

+1;不过,所有格量词仅适用于 Java、PCRE 或 JGSoft 正则表达式引擎。 Ruby、Perl 和 .NET 使用原子组 (?&gt;.*) @Tim 我提到了这一点,但我现在在我的回答中更加明确了。 @Tim:Perl 确实支持占有量词,可能从 5.10 开始 @ninjalj:感谢您提供的信息。那么this comparison 似乎不再是最新的了。 很棒的答案!真的帮助我理解了+很多。谢谢。【参考方案2】:

在大多数实现中,+ 表示“一个或多个”。

在一些理论著作中,+ 用于表示“或”(大多数实现使用| 符号)。

【讨论】:

【参考方案3】:

1 个或多个先前的表达式。

[0-9]+

匹配:

1234567890

在:

我有 1234567890 美元

【讨论】:

【参考方案4】:

前面的符号出现一次或多次。

例如a+ 表示字母a 一次或多次。因此,a 匹配 aaaaaaaaa,但不是空字符串。

如果您知道星号 (*) 的含义,那么您可以将(exp)+ 表示为(exp)(exp)*,其中(exp) 是任何正则表达式。

【讨论】:

【参考方案5】:

很大程度上取决于+ 符号出现的位置以及正则表达式的风格。

在posix-bre 和vim(在非魔法模式下)风格中,+ 匹配文字+ 字符。例如。 sed 's/+//g' file &gt; newfile 删除 file 中的所有 + 字符。如果您想在此处使用+ 作为quantifier,请使用\+(在GNU 工具中支持),或替换为\1,\ 或将量化模式加倍并从第一部分删除量词并添加* (零次或多次出现量词)在另一个之后(例如sed 's/c++*//' 删除c 后跟一个或多个+ 字符)。

在posix-ere 和其他正则表达式风格中,在character class ([...]) 之外,+ 充当量词,意思是“一个或多个,但尽可能多地出现量化模式*。例如,javascripts.replace(/\++/g, '-') 将用单个- 替换像++++ 这样的字符串。注意在 NFA 正则表达式风格中+ 有一个 lazy counterpart、+?,它匹配“一个或多个,但尽可能很少,出现的量化模式”。

在字符类中+ 字符被视为文字字符,在每个正则表达式风格中[+] 始终匹配单个 + 文字字符。例如。在c#,Regex.Replace("1+2=3", @"[+]", "-") 将导致1-2=3注意在一个字符类中使用单个字符不是一个好主意,只对两个或多个字符或字符集使用一个字符类。例如。 [+0-9] 匹配 + 或任何 ASCII 数字字符。在php 中,preg_replace('~[\s+]+~', '-', '1 2+++3') 将导致1-2-3,因为正则表达式匹配一个或多个(由于最后一个+ 是一个量词)空格(\s)或加字符(+ 包含在字符类中)。

+ 符号也可以是某些类似 PCRE 的正则表达式风格(php、ruby、java、boost、icu 等)中 possessive quantifier 的一部分(但没有在python re, .net, javascript). 例如C\+++(?!\d) 在php PCRE 将匹配C 然后一个或多个+ 符号(@9876543737@ - 文字@9876和++ 再出现一次,允许回溯到这个量化模式)后面没有数字。如果加字符后有一个数字,则整个匹配失败。其他示例:a?+(一个或零 a 字符) 、a1,3+(尽可能多的一到三个a 字符)、a3+(=a3、三个as)、a*+ 匹配零个或多个a 字符。

【讨论】:

以上是关于正则表达式中 + 的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

/gi 在正则表达式中的含义是啥? [复制]

sed 和正则表达式中逗号“,”的所有含义是啥?

var regex = /^[\d\,\.]*$/;这个正则是啥含义

js 正则表达式 \\-是啥意思

lua正则匹配中\t是啥意思?

正则表达式(/[^0-9]/g,'')中的"/g"是啥意思 ?????