您的位置:首页 > 其它

关于捕获组和非捕获组得区别和侵占式表达式的作用

2012-05-13 10:55 344 查看
以 (? 开头的都是非捕获组,都是不进行捕获的。

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

匹配 June 和 July 可以写成:

Java code
Ju(ne|ly)


也可以写成

Java code
Ju(?:ne|ly)


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

至于 (?>XX) 跟 (?:XX) 完全是没有关系的。

以 Mastering Regular Expressions 中的一个例子来说明:

将一些多位的小数截短到三位小数:

\d+\.\d\d[1-9]?\d+

在这种条件下 6.625 能进行匹配,这样做没有必要,因为它本身就是三位小数。最后一个“5”本来是给 [1-9] 匹配的,但是后面还有一个 \d+ 所以,[1-9] 由于是“?”可以不匹配所以只能放弃当前的匹配,将这个“5”送给 \d+ 去匹配,如果改为:

\d+\.\d\d[1-9]?+\d+

的侵占形式,在“5”匹配到 [1-9] 时,由于是侵占式的,所以不会进行回溯,后面的 \d+ 就匹配不到任东西了,所以导致 6.625 匹配失败。

这种情况,在替换时就有效了,比如把数字截短到小数点后三位,如果正好是三位小数的,就可以不用替换了,可以提高效率,侵占量词基本上就是用来提高匹配效率的。

把 \d+\.\d\d[1-9]?+\d+ 改为 \d+\.\d\d(?>[1-9]?)\d+ 这样是一样的。

想要了解更多的关于正则表达式的内容,可以看看独树一帜的正则表达式书籍:

Jeffrey E.F.Friedl 的 Mastering Regular Expressions,最新版本是第三版,CSDN 下载频道中有下载的。

来自http://topic.csdn.net/u/20080325/17/fb7a3e8d-029a-4d8e-89ae-77a9d28ec301.html15楼的回答
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: