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+mysql写的留言本
Oct 09 PHP
使PHP自定义函数返回多个值
Nov 26 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
Dec 19 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
PHP英文字母大小写转换函数小结
May 03 PHP
php进行支付宝开发中return_url和notify_url的区别分析
Dec 22 PHP
php+mysql删除指定编号员工信息的方法
Jan 14 PHP
php使用Cookie实现和用户会话的方法
Jan 21 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 PHP
分享PHP-pcntl 实现多进程代码
Sep 30 PHP
Linux下快速搭建php开发环境
Mar 13 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
Sep 03 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入门的学习方法
2007/01/02 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
JavaScript实现拼音排序的方法
2012/11/20 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
微信小程序 登录的简单实现
2017/04/19 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
金鑫耀Java笔试题
2014/09/06 面试题
电子商务专员岗位职责
2013/12/11 职场文书
初中同学聚会邀请函
2014/02/03 职场文书
财务支持类个人的自我评价
2014/02/14 职场文书
美术毕业生求职信
2014/02/25 职场文书
开学典礼主持词
2014/03/19 职场文书
优秀毕业生的求职信
2014/07/21 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
英文导游词
2015/02/13 职场文书
辞职信的写法
2015/02/27 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
Pygame Draw绘图函数的具体使用
2021/11/17 Python