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 相关文章推荐
BBS(php &amp; mysql)完整版(四)
Oct 09 PHP
杏林同学录(一)
Oct 09 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
Nov 07 PHP
php反射应用示例
Feb 25 PHP
ThinkPHP让分页保持搜索状态的方法
Jul 02 PHP
php的ddos攻击解决方法
Jan 08 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
Nov 05 PHP
php的socket编程详解
Nov 20 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 PHP
如何修改yii2.0自带的user表为其它的表
Aug 01 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 PHP
php使用自带dom扩展进行元素匹配的原理解析
May 29 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
Laravel 5 框架入门(四)完结篇
2015/04/09 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
预加载css或javascript的js代码
2010/04/23 Javascript
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
node.js中的Socket.IO使用实例
2014/11/04 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
Js apply方法详解
2017/02/16 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
python输入整条数据分割存入数组的方法
2018/11/13 Python
python pygame模块编写飞机大战
2018/11/20 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
pyshp创建shp点文件的方法
2018/12/31 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
ktv总经理岗位职责
2014/02/17 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
关于运动会的广播稿
2014/09/22 职场文书
解约证明模板
2015/06/19 职场文书
go结构体嵌套的切片数组操作
2021/04/28 Golang