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合并数组array_merge函数运算符加号与的区别
Oct 31 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
May 18 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
May 29 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
Dec 06 PHP
php无限分类且支持输出树状图的详细介绍
Jun 19 PHP
PHP的构造方法,析构方法和this关键字详细介绍
Oct 22 PHP
php函数重载的替代方法--伪重载详解
May 08 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
ThinkPHP框架分布式数据库连接方法详解
Mar 14 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
May 24 PHP
PHP格式化显示时间date()函数代码
Oct 03 PHP
PHP扩展安装方法步骤解析
Nov 24 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中将数组转成XML格式的实现代码
2011/08/08 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
PHP中soap的用法实例
2014/10/24 PHP
PHP统一页面编码避免乱码问题
2015/04/09 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
Bootstrap模态对话框中显示动态内容的方法
2018/08/10 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
Django 过滤器汇总及自定义过滤器使用详解
2019/07/19 Python
python自定义时钟类、定时任务类
2021/02/22 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
pytorch ImageFolder的覆写实例
2020/02/20 Python
浅谈django channels 路由误导
2020/05/28 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
HTML5移动端开发遇见的东西
2019/10/11 HTML / CSS
二手车交易协议书标准版
2014/11/16 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
单位工资证明范本
2015/06/12 职场文书
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers