的group名字,backreference后面详细讲述。这个语法形式是.Net正则表达式的,其它正则表达式引擎也有支持条件式结构的,但语法可能不一样。
例如正则式(?(\\d{4})((19|20)\\d{2})|(\\d{2}))匹配文本串\"2004年 98年\",结果是\"2004\", \"98\",其中\"2004\"是使用patternYes部分匹配出来的,而\"98\"是使用patternNo部分。
Quantifier(量词)
指表达式需要重复匹配多少次。
* 0或多次
+ 1或多次
? 作为量词时表示0或1次,在其它量词后面出现时作为greedy, lazy/non-greedy模式开关。
{n} n次
{n,} 最少n次
{n,m} 最少n次,最多m次
*?, +?, {n}?, {n,}?, {n,m}? 开启lazy/non-greedy模式,例如{n,m}表示最少n次,最多m次,在这个范围内尽可能少的匹配。
greedy, lazy/non-greedy模式参考下面相关部分。
Zero-Width Assertions(零宽度断言)
这种结构产生的匹配结果长度为0(所以称作零宽度),只是用于对上下文环境做判断(所以称作断言)。
^ 如果使用Multiline选项,匹配每一行的开始位置;如果使用Singleline选项,匹配整个字符串开始位置。^如果出现在中就不是Zero-Width Assertion了。
contentnbsp; 如果使用Multiline选项,匹配每一行的结束位置(\\n之前);如果使用Singleline选项,匹配整个字符串结束位置。
\\A 忽略Multiline选项(相当于取消Multiline选项并设置Singleline选项),匹配整个字符串开始位置。
\\Z 忽略Multiline选项,匹配整个字符串结束位置,中间的\\n不会考虑。.Net中\\z和\\Z的效果完全一样,不知道是bug还是怎么回事。
前面提到的条件式结构,以及\\b如果不是出现在中,都是Zero-Width Assertions;后面将会讲到的lookahead, lookbehind也是一种Zero-Width Assertion。
Multiline, Singleline等,参考正则表达式选项部分。
Greedy, Lazy/Non-greedy(贪婪模式,惰性模式)
在使用quantifier量词修饰,需要执行重复n次的匹配中,greedy模式尽可能多的匹配更多字符,而lazy/non-greedy模式则尽可能少的匹配字符。
NFA(参考后面NFA, DFA部分)默认都是采用greedy模式,而当今主要正则表达式引擎都是NFA,因此注意greedy模式的影响。将greedy模式改为non-greedy,在量词修饰符后面添加\"?\"实现。例如NFA中\\w+为greedy模式,\\w+?为non-greedy模式。 [Page]
文本串为:\"dxxxdxxxd\",greedy模式:
Regular Expression Result
(d)(\\w+) \"\\w+\"将匹配第一个\"d\"之后的所有字符\"xxxdxxxd\"
(d)(\\w+)(d) \"\\w+\"将匹配第一个\"d\"和最后一个\"d\"之间的所有字符\"xxxdxxx\"。虽然\"\\w+\"也能够匹配上最后一个\"d\",但是为了使整个表达式匹配成功,\"\\w+\"可以\"让出\"它本来能够匹配的最后一个\"d\"
文本串为:\"dxxxdxxxd\",non-greedy模式:
Regular Expression Result
(d)(\\w+?) \"\\w+?\"将尽可能少的匹配第一个\"d\"之后的字符,结果是:\"\\w+?\"只匹配了一个\"x\"(第二个字符)
(d)(\\w+?)(d) 为了让整个表达式匹配成功,\"\\w+?\"不