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 相关文章推荐
生成缩略图
Oct 09 PHP
PHP 高手之路(三)
Oct 09 PHP
session在PHP大型web应用中的使用
Jun 25 PHP
洪恩在线成语词典小偷程序php版
Apr 20 PHP
PHP人民币金额数字转中文大写的函数代码
Feb 27 PHP
php接口和抽象类使用示例详解
Mar 02 PHP
php 解压rar文件及zip文件的方法
May 05 PHP
php实现监控varnish缓存服务器的状态
Dec 30 PHP
smarty简单应用实例
Nov 03 PHP
微信支付开发发货通知实例
Jul 12 PHP
详谈PHP中的密码安全性Password Hashing
Feb 04 PHP
Laravel 模型关联基础教程详解
Sep 17 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
图形数字验证代码
2006/10/09 PHP
php通过COM类调用组件的实现代码
2012/01/11 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
js 跳出页面的frameset框架示例介绍
2013/12/23 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
如何在微信小程序中存setStorage
2019/12/13 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
[02:05]2014DOTA2西雅图邀请赛 专访啸天mik夫妻档
2014/07/08 DOTA
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
Python文件的读写和异常代码示例
2017/10/31 Python
DataFrame中的object转换成float的方法
2018/04/10 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
什么是Python包的循环导入
2020/09/08 Python
pycharm专业版远程登录服务器的详细教程
2020/09/15 Python
Python内置函数及功能简介汇总
2020/10/13 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
财务人员个人求职信范文
2013/12/04 职场文书
科级干部考察材料
2014/02/15 职场文书
社区工作者感言
2014/03/02 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书