正则固化分组(?>...)

之前在 正则表达式30分钟入门教程 中了解过 (?:...)、(?=...)、 (?<=...)、 (?!)、(?<!...),

1、(?:) 分组单不捕获

2、(?=) 顺序环视(从左到右)  例如: (?=\d) 检查当前位置的右侧是否匹配数字

3、(?<=) 逆序环视(从右到左) 例如: (?<=\d) 检查当前位置的左侧是否匹配数字

【注】:环视不会”占用“字符

            例如:字符串 "abcdef"

            /(?=abc)abc/和/abc(?=def)/ 匹配结果是一样的

 

但是里面并没有详细介绍(?>...),以下就来介绍这个奇怪的表达式

 

摘自《精通正则表达式》P139

固化分组:(?>...)

「.*」在固化分组中,永远不会"交还"已经匹配的任何内容。固化分组还有一个重要的用途,尤其是能提高匹配的效率

 

例:

preg_match('/.*[0-9]/', 'abcdef9', $m);
var_dump($m);
preg_match('/(?>.*)[0-9]/', 'abcdef9', $m);
var_dump($m);
/**
 * 
array (size=1)
  0 => string 'abcdef9' (length=7)

array (size=0)
  empty

 */

第二个使用了固化分组,「.*」可以匹配整行记录,不会"交还"最后的数字,[0-9]得不到匹配所以匹配失败

第一个虽然也使用了「.*」,「.*」也可以匹配整行记录,但为了整个表达式的匹配,「.*」会"交还"最后的数字9,

 

如果要深入了解固化分组可以查看《精通正则表达式》一书的P171 和 P269

 

posted @ 2015-02-13 17:12  1317660800  阅读(776)  评论(0编辑  收藏  举报