2010年1月24日星期日

[转]正则表达式中的非捕获组(none-captrue group)

转自:http://www.cnblogs.com/tmrcp/archive/2009/07/20/1527077.html

捕获组(capturing group)是把多个字符当作一个单元对待的一种方式。通过把字符括在括号内创建捕获组。例如,正则表达式(dog)创建包含字母“d”、“o”和“g” 的一个组。输入字符串和捕获组匹配的那一部分将被保存在内存中,以便以后通过反向引用再次使用。

而非捕获组就是输入字符串和捕获组匹配的那一部分将不被保存在内存中。这有什么用呢?当然是能够节省内存了,下面具体说下非捕获组里的那8个Special constructs(下面的内容大部分是我摘抄论坛上一个叫“火龙果”兄弟的回贴,然后再加上些我自己的理解):

 

以 (? 开头的都是非捕获组,都是不进行捕获的。

(?:XXX) 这个比较常用,在不需要捕获时可以替换 (XXX),比如:


匹配 June 和 July 可以写成:
Ju(ne|ly)

也可以写成
Ju(?:ne|ly)

前者会把 ( ) 内的在匹配后保留在内存中,而后者不会。

以 (? 开头,) 结尾的都称为非捕获组,在匹配完成后在内存中不保留匹配到的字符。


(?:X)

    X 作为非捕获组
与捕获组 ( ) 的意思一样也是将其作为一组进行处理,与捕获组的区别在于不捕获匹配的文本,
仅仅作为分组。
比如:要匹配 123123 这个,就可以写为 (123)\1 使用反向引用,这时只能用捕获组,在匹配
123 后会保留在内存中,便于反向引用,而 (?:123) 在匹配完后则不会保留,区别仅在于此。

没有评论: