正则基础之——非捕获组

非捕获组:(?:Expression)html

接触正则表达式不久的人,一般都会对非捕获比较迷惑,为何要有非捕获组?做用是什么?应该在什么场景下使用?正则表达式

说到非捕获组,首先要了解什么是捕获组,详细内容参考 正则基础之——捕获组(capture group)。 post

一、为何要有非捕获组spa

一旦使用了“()”,就会默认为是普通捕获组,从而将“()”内表达式匹配的内容捕获到组里。可是有些状况下,不得不用“()”,但并不关心“()”中匹配的内容是什么,后面也不会引用捕获到的内容,这带来了一个反作用,记录这些捕获组就会占用内存,下降匹配效率。.net

设计非捕获组的目的就是为了抵消这种反作用。 只进行分组,并不将子表达式匹配到的内容捕获到组里。设计

二、不得不使用(),由此可能带来反作用的状况htm

如下举例中只说明场景,举例比较简单,实际应用涉及到时可能会比较复杂。blog

a)         使用“|”表示“或”的关系时,用“()”限制范围内存

举例:匹配0到100的数字get

正则表达式:^([1-9]?[0-9]|100)$

若是不用“()”来限制“|”的范围,结果就会出错,详见“|”的解释。

b)         使用量词限定一个子表达式总体的匹配次数

举例:匹配HH:mm:ss格式时间

正则表达式:([01][0-9]|2[0-3])(:[0-5][0-9]){2}

这里的“{2}”是对前面的“:[0-5][0-9]”总体做修饰,所以要用“()”来限定修饰的范围。

固然,量词还能够是?、*、+、{m}、{m,n}、{m,},以及非贪婪模式的量词等。

c)         某些时候为了使捕获组的编号可控,可能会用到非捕获组,这种应用很少,这里不赘述。

三、何时该用非捕获组

非捕获组主要是在涉及到效率时才考虑使用,而效率一般都是相对的,须要综合考虑。

不考虑效率的场合,能够不用非捕获组,以提升正则表达式的可读性。

一些很是简单的正则中,若是使用了非捕获组,由于要解析这种语法,反而可能会下降匹配效率。

通常在较复杂,“()”使用较多的正则表达式中能够考虑使用非捕获组,好比验证日期的正则表达式。

未使用非捕获组的正则:

^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$

因为这里的“()”都是用做分组,并不关心分组匹配到的内容,并且使用的()不少,影响匹配效率,因此这个正则表达式中可使用非捕获组。

^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

转载于:https://www.cnblogs.com/Eleanore/archive/2012/06/13/2548213.html