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

Noo*_*ath 30 regex symbols

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

Dan*_*uis 61

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

与上面提到的其他答案一样,+通常是重复运算符,并使前面的标记重复一次或多次.a+aa*形式语言理论中表达,也可以表示为a{1,}(匹配最少1次,最多次无限次).


然而,+也可以使其他的量词的占有欲,如果它遵循一个重复操作符(即?+,*+,++或).占有量词是一些正则表达式(PCRE,Java和JGsoft引擎)的高级功能,它告诉引擎一旦匹配就不会回溯.{m,n}+

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

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

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


1在大多数引擎中,除非指定了/s("singleline"或"dotall")修饰符,否则点将与换行符不匹配.


sep*_*p2k 13

在大多数实现中+意味着"一个或多个".

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


Chr*_*ris 7

先前表达式中的一个或多个.

[0-9]+

会匹配:

1234567890

在:

我有1234567890美元


phi*_*mue 5

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

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

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