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面向对象全攻略 (十二) 抽象方法和抽象类
Sep 30 PHP
细谈php中SQL注入攻击与XSS攻击
Jun 10 PHP
CodeIgniter使用phpcms模板引擎
Nov 12 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
Nov 13 PHP
PHP中的替代语法简介
Aug 22 PHP
php单态设计模式(单例模式)实例
Nov 18 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
Nov 16 PHP
详解Yii2 定制表单输入字段的标签和样式
Jan 04 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
PHP join()函数用法与实例讲解
Mar 11 PHP
浅谈PHP各环境下的伪静态配置
Mar 13 PHP
php layui实现前端多图上传实例
Jul 30 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
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
用js编写的简单的计算器代码程序
2015/08/04 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
2020/06/01 Javascript
深度解读vue-resize的具体用法
2020/07/08 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
python循环监控远程端口的方法
2015/03/14 Python
Python开发的实用计算器完整实例
2017/05/10 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
python字符串下标与切片及使用方法
2020/02/13 Python
Python如何脚本过滤文件中的注释
2020/05/27 Python
详解python的super()的作用和原理
2020/10/29 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
北承题目(C++)
2012/05/16 面试题
应届生会计求职信
2013/11/11 职场文书
教育课题研究自我鉴定范文
2013/12/28 职场文书
医学生职业规划范文
2014/01/05 职场文书
高中生的自我鉴定范文
2014/01/24 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
成本会计岗位职责
2015/02/03 职场文书
安全承诺书格式范本
2015/04/28 职场文书
经营场所使用证明
2015/06/19 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
MySQL数据库必备之条件查询语句
2021/10/15 MySQL