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入门小知识
Mar 24 PHP
PHP EOT定界符的使用详解
Sep 30 PHP
php mssql 数据库分页SQL语句
Dec 16 PHP
php中选择什么接口(mysql、mysqli)访问mysql
Feb 06 PHP
深入PHP nl2br()格式化输出的详解
Jun 05 PHP
Thinkphp中Create方法深入探究
Jun 16 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
Aug 19 PHP
PHP+MYSQL会员系统的开发实例教程
Aug 23 PHP
Linux下PHP加速器APC的安装与配置笔记
Oct 24 PHP
PHP保存带BOM文件的方法
Feb 12 PHP
PHP 读取文本文件内容并分页显示
Jan 02 PHP
php技巧小结【推荐】
Jan 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之第三天
2006/10/09 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
10个实用的PHP正则表达式汇总
2014/10/23 PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
2017/10/11 PHP
js购物车实现思路及代码(个人感觉不错)
2013/12/23 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
2015/02/26 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
JavaScript实现全选取消效果
2017/12/14 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
vue实现商城秒杀倒计时功能
2019/12/12 Javascript
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
[42:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS OpTic
2018/03/31 DOTA
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
Python实现的密码强度检测器示例
2017/08/23 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
2018/04/24 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
详解Python if-elif-else知识点
2018/06/11 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
Python 实现简单的客户端认证
2020/07/29 Python
台湾深度自由行旅游平台:Tripbaa趣吧
2017/10/10 全球购物
客户表扬信范文
2014/01/10 职场文书
党委班子对照检查材料
2014/08/19 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
优秀党员先进材料
2014/12/18 职场文书
总经理司机岗位职责
2015/04/10 职场文书
内勤岗位职责范本
2015/04/13 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS