关于捕获组和非捕获组得区别和侵占式表达式的作用
2012-05-13 10:55
344 查看
以 (? 开头的都是非捕获组,都是不进行捕获的。
(?:XXX) 这个比较常用,在不需要捕获时可以替换 (XXXX),比如:
匹配 June 和 July 可以写成:
Java code
也可以写成
Java code
前者会把 ( ) 内的在匹配后保留在内存中,而后者不会。
至于 (?>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楼的回答
(?: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楼的回答
相关文章推荐
- android 关于 clipToPadding 和 clipChildren区别和作用
- 关于数据库主键和外键的作用与区别
- 函数声明 和 匿名函数表达式 在作用域内的区别
- 关于break和continue以及label的区别和作用(详解)
- 关于构造代码块、局部代码块和静态代码块的作用和区别
- 关于Cookie的原理、作用,区别以及使用
- 关于jquery中的$.fn.extend $.extend() 的作用及区别
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
- 关于重定向符>>与>的区别与作用
- JavaScript之中关于一些正则表达式的区别
- 关于Java正则表达式捕获组详解
- 关于事件冒泡和捕获的区别
- matlab中关于@的作用(函数表达式句柄)
- 关于regex_iterator()和regex_token_iterator()的区别,与他们不同参数时的不同的作用
- 关于HttpHandler和HttpModule区别,作用
- 关于regex_iterator()和regex_token_iterator()的区别,与他们不同参数时的不同的作用
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
- 关于利用正则表达式捕获匹配的字符串的简单功能(java)
- 关于Dll和lib的区别及作用
- 蛙蛙请教:js里的match方法和exec方法的区别,关于正则表达式的