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

时间:2010-10-03 14:52:02

标签: regex symbols

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

4 个答案:

答案 0 :(得分:56)

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

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


但是,如果+遵循重复运算符(?+*+++{m,n}+.*也可以生成其他量词possessive })。占有量词是一些正则表达式(PCRE,Java和JGsoft引擎)的高级功能,它告诉引擎一旦匹配就不会回溯。

要了解其工作原理,我们需要了解正则表达式引擎的两个概念:贪婪回溯。贪婪意味着一般来说,正则表达式会尝试消耗尽可能多的字符。假设我们的模式是aaaaaaaabdot是正则表达式中的特殊构造,这意味着任何字符 1 ;星形意味着匹配零或更多时间),你的目标是.*b。将消耗整个字符串,因为整个字符串是满足模式的最长匹配。

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

占有量词也很贪婪,但正如所提到的,一旦他们返回一场比赛,引擎就不能再回过头了。因此,如果我们将模式更改为b(匹配任何字符零次或更多次,占有,然后匹配aaaaaaaab),并尝试匹配.*,则再次/s将占用整个字符串,但由于它是占有性的,因此丢弃了回溯信息,并且b不能匹配,因此模式失败。


1 在大多数引擎中,除非指定{{1}}(“singleline”或“dotall”)modifier,否则该点与换行符不匹配

答案 1 :(得分:12)

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

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

答案 2 :(得分:6)

之前表达式中的一个或多个。

[0-9]+

匹配:

  

1234567890

在:

  

我有1234567890美元

答案 3 :(得分:3)

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

E.g。 a+表示字母a一次或多次。因此,a匹配aaaaaaaaa,但不匹配空字符串。

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