正则表达式中+的含义是啥?
Posted
技术标签:
【中文标题】正则表达式中+的含义是啥?【英文标题】:What is the meaning of + in a regex?正则表达式中+的含义是什么? 【发布时间】:2022-01-06 18:13:46 【问题描述】:正则表达式中的加号是什么意思?
【问题讨论】:
你能发个样本吗?/s+a+m+p+l+e+/
^^ 匹配 sample
、samplee
和 sssaaaaaammmppplllllle
,但不匹配 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 使用原子组(?>.*)
。
@Tim 我提到了这一点,但我现在在我的回答中更明确了。
@Tim:Perl 确实支持占有量词,可能从 5.10 开始
@ninjalj:感谢您提供的信息。那么this comparison 似乎不再是最新的了。
很棒的答案!真的帮助我理解了+很多。谢谢。【参考方案2】:
在大多数实现中,+
表示“一个或多个”。
在一些理论著作中,+
用于表示“或”(大多数实现使用|
符号)。
【讨论】:
【参考方案3】:1 个或多个先前的表达式。
[0-9]+
匹配:
1234567890
在:
我有1234567890美元
【讨论】:
【参考方案4】:前面的符号出现一次或多次。
例如a+
表示字母a
一次或多次。因此,a
匹配 a
、aa
、aaaaaa
,但不是空字符串。
如果您知道星号 (*
) 的含义,那么您可以将(exp)+
表示为(exp)(exp)*
,其中(exp)
是任何正则表达式。
【讨论】:
以上是关于正则表达式中+的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章