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")修饰符,否则点将与换行符不匹配.
前面的符号出现一次或多次。
例如,a+表示字母a一次或多次。因此,a匹配a, aa,aaaaaa但不是空字符串。
如果您知道星号 ( *) 的含义,那么您可以将其表示(exp)+为(exp)(exp)*,where(exp)是任何正则表达式。
| 归档时间: |
|
| 查看次数: |
33675 次 |
| 最近记录: |