以 (? 开头的都是非捕获组,都是不进行捕获的。
(?:XXX) 这个比较常用,在不需要捕获时可以替换 (XXXX),比如:
匹配 June 和 July 可以写成:
也可以写成
前者会把 ( ) 内的在匹配后保留在内存中,而后者不会。
至于 (?>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+ 这样是一样的。
想要了解更多的关于正则表达式的内容,可以看看独树一帜的正则表达式书籍:
(?: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楼的回答