正则表达式中的加号是什么意思?
答案 0 :(得分:56)
+
实际上可以有两种含义,具体取决于上下文。
与上面提到的其他答案一样,+
通常是repetition运算符,并使前面的标记重复一次或多次。 a+
在formal language theory中表示为aa*
,也可以表示为a{1,}
(最少匹配1次,最多匹配无限次)。
但是,如果+
遵循重复运算符(?+
,*+
,++
或{m,n}+
,.*
也可以生成其他量词possessive })。占有量词是一些正则表达式(PCRE,Java和JGsoft引擎)的高级功能,它告诉引擎一旦匹配就不会回溯。
要了解其工作原理,我们需要了解正则表达式引擎的两个概念:贪婪和回溯。贪婪意味着一般来说,正则表达式会尝试消耗尽可能多的字符。假设我们的模式是aaaaaaaab
(dot是正则表达式中的特殊构造,这意味着任何字符 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
匹配a
,aa
,aaaaaa
,但不匹配空字符串。
如果您知道星号(*
)的含义,那么您可以将(exp)+
表达为(exp)(exp)*
,其中(exp)
是任何正则表达式。