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 11 PHP
PHP 简单日历实现代码
Oct 28 PHP
一个简单php扩展介绍与开发教程
Aug 19 PHP
php单例模式实现(对象只被创建一次)
Dec 05 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
php通过function_exists检测函数是否存在的方法
Mar 18 PHP
如何使用php实现评委评分器
Jul 31 PHP
PHP内存使用情况如何获取
Oct 10 PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 PHP
PHP简单留言本功能实现代码
Jun 09 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
Apr 10 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
May 05 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
调频问题解答
2021/03/01 无线电
做个自己站内搜索引擎
2006/10/09 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
js获取页面引用的css样式表中的属性值方法(推荐)
2016/08/19 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
详解redux异步操作实践
2018/08/15 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
Python实现的序列化和反序列化二叉树算法示例
2019/03/02 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
Python如何给你的程序做性能测试
2020/07/29 Python
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
护理专科毕业生自荐书范文
2014/02/19 职场文书
学生安全承诺书
2014/05/22 职场文书
扬尘污染防治方案
2014/06/15 职场文书
大专学生求职自荐信
2014/07/06 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
文员岗位职责
2015/02/04 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
节约用电倡议书
2015/04/28 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电