正则表达式中的加号符号代表什么意思?
+
在不同的上下文中有两种不同的含义。
像其他答案提到的那样,+
通常是一个重复运算符,会导致前面的标记重复一次或多次。在形式语言理论中,a+
可以表示为aa*
,也可以表示为a{1,}
(匹配至少1次和最多无限次)。
+
跟随重复运算符(即?+
、*+
、++
或{m,n}+
),它也可以使其他量词possessive。占有量词是一些正则表达式引擎(PCRE、Java和JGsoft引擎)的高级功能,告诉引擎在匹配成功后不要回溯。.*
(dot是正则表达式中的特殊构造,表示任何字符1;星号表示匹配零次或多次),目标是aaaaaaaab
。整个字符串将被消耗,因为整个字符串是满足模式的最长匹配。.*b
。现在,当正则表达式引擎尝试匹配aaaaaaaab
时,.*
将再次消耗整个字符串。但是,由于引擎已经到达了字符串的末尾,并且模式尚未满足(.*
消耗了除b
之外的所有内容,但模式仍然必须匹配b
),因此它会回溯,一次一个字符地尝试匹配b
。第一次回溯将使.*
消耗aaaaaaaa
,然后b
可以消耗b
,模式成功。.*+b
(匹配任意字符零次或多次,具有占有性质,后跟b
),并尝试匹配aaaaaaaab
,同样,.*
将消耗整个字符串,但是由于它是占有性质的,回溯信息被丢弃,因此无法匹配b
,模式失败。
1 在大多数引擎中,点号不会匹配换行符,除非指定了/s
("singleline"或"dotall")modifier修饰符。
(?>.*)
。 - Tim Pietzcker+
表示“一个或多个”。+
被用来表示“或”(大多数实现使用|
符号表示)。1 或多个前面的表达式。
[0-9]+
将匹配:
1234567890
在以下文本中匹配:
我有1234567890美元
前一个符号出现一次或者多次。
例如,a+
表示字母a
出现一次或者多次。因此,a
可以匹配a
、aa
、aaaaaa
但不能匹配空字符串。
如果您知道星号(*
)的含义,则可以将(exp)+
表示为(exp)(exp)*
,其中(exp)
是任何正则表达式。
+
字符都被视为字面字符。 [+]
总是匹配单个+
字面字符。例如,在c#中,Regex.Replace("1+2=3", @"[+]", "-")
将导致1-2=3
。请注意,在字符类中使用单个字符不是一个好主意,只有在需要两个或更多字符或字符集时才使用字符类。例如,[+0-9]
匹配一个+
或任何ASCII数字字符。在php中,preg_replace('~[\s+]+~', '-', '1 2+++3')
将导致1-2-3
,因为正则表达式匹配一个或多个(由于最后一个+
是量词符号)空格(\s
)或加号字符(字符类内的+
)。
+
符号也可以是一些PCRE类正则表达式(如possessive quantifier)的一部分,例如php、ruby、java、boost、icu等(但不包括python re
、.net、javascript)。例如,在php PCRE中,C\+++(?!\d)
将匹配C
,然后是一个或多个+
符号(\+
表示一个字面上的+
,++
表示允许回溯到此量化模式中的一个或多个出现),但不跟在数字后面。如果加号字符后面有数字,则整个匹配失败。其他例子:a?+
(一个或零个a
字符)、a{1,3}+
(尽可能多地匹配一个到三个a
字符)、a{3}+
(=a{3}
,三个a
)和a*+
(匹配零个或多个a
字符)。
/s+a+m+p+l+e+/
- Déjà vu