PHP之正则表达式捕获组与非捕获组(详解)


Posted in PHP onJuly 29, 2015

在项目开发过程中正则表示经常会用到,可以说会正则表达式是每个程序员最基本的要求,初学者在刚接触正则表达式都感到很吃力。最近看到一位朋友的博客写的《PHP正则表达式》获益颇多,在章节对通配符以及捕获数据非常感兴趣。这两章节刚好也涉及到了正则表达式的捕获组和非捕获组的内容,以此来分析这方面的内容

我们知道,在正则表达式下(x) 表示匹配'x'并记录匹配的值。这只是比较通俗的说法,甚至说这是不严谨的说法,只有()捕获组形式才会记录匹配的值。非捕获组则只匹配,不记录。

捕获组:

(pattern)

这种形式是我们见到最多的一种形式,匹配并返回捕获结果,可以嵌套,组号顺序从左到右依次排列‘。

$regex = '/(ab(c)+)+d(e)?/';    

$str = 'abccde';

$matches = array();

 

if(preg_match($regex, $str, $matches)){

    print_r($matches);

}

匹配结果:

Array ( [0] => abccde [1] => abcc [2] => c [3] => e )
(?P<name>pattern)

这种方式虽然看起来在构造正则表达式的时候略微复杂一点,但实质上与(pattern)一样。最大的优势体现在对结果处理上,程序员可以直接根据自己设置的<name>直接快速调用结果,而不用再去数需要的结果在第几个子组了。

$regex = '/(?P<group1>\w(?P<group2>\w))abc(?P<group3>\w)45/';
$str = 'fsabcd45';

$matches = array();

 

if(preg_match($regex, $str, $matches)){

    print_r($matches);

}
 

匹配结果:

Array ( [0] => fsabcd45 [group1] => fs [1] => fs [group2] => s [2] => s [group3] => d [3] => d )
\num

num是一个整数,是对捕获组的反向引用。  例如\2表示第二个子组匹配值,\表示第一个子组匹配值

$regex = '/(\w)(\w)\2\1/';    

$str = 'abba';

$matches = array();

 

if(preg_match($regex, $str, $matches)){

    print_r($matches);

}

匹配结果:

Array ( [0] => abba [1] => a [2] => b )

注意,这里我疏忽了一个小细节,一开始我第一样代码是 $regex = “/(\w)(\w)\2\1/”;  结果返回无匹配结果,经过调试后,发现这里只能用' '。'与" 用法差别大家还是需要注意下。

  \k< name >

了解了(?P<name>pattern)与\num,这个就不难理解了。\k< name >是对命名捕获组的反向引用。其中 name 是捕获组名。

$regex='/(?P<name>\w)abc\k<name>/';
$str="fabcf";

echo preg_match_all($regex, $str,$matches);

print_r($matches);

匹配结果:

Array ( [0] => Array ( [0] => fabcf ) [name] => Array ( [0] => f ) [1] => Array ( [0] => f ) )

非捕获组:

(?:pattern)

与(pattern)的唯一区别是,匹配pattern但不捕获匹配结果。这里便不再举例。

还有四种方式实际上讲的是一个事情:预查。

预查分为正向预查与反向预查。根据字面理解,正向预查是判断匹配字符串后面某些字符存在与否,而反向预查则是判断匹配字符串前面某些字符存在与否。

正向预查判断存在使用(?=pattern),判断不存在使用(?!pattern)。

反向预查判断存在使用(?<=pattern),判断不存在使用(?<!pattern)。

$regx='/(?<=a)bc(?=d)/';
$str="abcd ebcd abce ebca";

if(preg_match_all($regx, $str, $matches)){

    print_r($matches);

}

匹配结果:

Array ( [0] => Array ( [0] => bc) )

这四种形式使用的是否只要注意好相对匹配字符串的位置和断言肯定还是否定,就会很快掌握。

另外,预查的四种形式是零宽度的,匹配的时候只做一个判断,本身是不占位置的。/HE(?=L)LLO/ 与HELLO匹配,而/HE(?=L)LO/与HELLO是不匹配的。毕竟但从字节数上两者就是不匹配的,前者只有4个,而后者有5个。

以上就是PHP之正则表达式捕获组与非捕获组详解的全部内容,希望对大家有所启迪。

PHP 相关文章推荐
PHP 学习路线与时间表
Feb 21 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
Dec 16 PHP
使用php get_headers 判断URL是否有效的解决办法
Apr 27 PHP
PHP在不同页面间传递Json数据示例代码
Jun 08 PHP
php获取根域名方法汇总
Oct 28 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
Jun 20 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
php实现概率性随机抽奖代码
Jan 02 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
Mar 31 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
Sep 10 PHP
PHP递归统计系统中代码行数
Sep 19 PHP
PHP实现的简单缓存类
Jul 29 #PHP
PHP实现简单爬虫的方法
Jul 29 #PHP
php获取网站百度快照日期的方法
Jul 29 #PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 #PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 #PHP
PHP模拟QQ登录的方法
Jul 29 #PHP
PHP实现动态web服务器方法
Jul 29 #PHP
You might like
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
2013/04/23 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
jQuery学习之prop和attr的区别示例介绍
2013/11/15 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
2015/08/09 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
python 获取文件列表(或是目录例表)
2009/03/25 Python
python格式化字符串实例总结
2014/09/28 Python
跟老齐学Python之变量和参数
2014/10/10 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
Python提取频域特征知识点浅析
2019/03/04 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
基于python实现查询ip地址来源
2020/06/02 Python
python属于解释型语言么
2020/06/15 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
建筑学推荐信
2013/11/03 职场文书
元旦晚会主持词
2014/03/24 职场文书
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
党员个人党性分析材料
2014/12/18 职场文书
老公婚前保证书
2015/02/28 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书
python如何获取网络数据
2021/04/11 Python
详解Laravel服务容器的优势
2021/05/29 PHP