登录  /  注册

PHP之正则表达式捕获组与非捕获组的详解

*文
发布: 2017-12-27 13:50:32
原创
1223人浏览过

本文主要介绍了php之正则表达式捕获组与非捕获组,通过实例详解php之正则表达式捕获组与非捕获组的区别。希望对大家有所帮助。

在项目开发过程中正则表示经常会用到,可以说会正则表达式是每个程序员最基本的要求,初学者在刚接触正则表达式都感到很吃力。最近看到一位朋友的博客写的《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 )
登录后复制

(?Ppattern)
这种方式虽然看起来在构造正则表达式的时候略微复杂一点,但实质上与(pattern)一样。最大的优势体现在对结果处理上,程序员可以直接根据自己设置的直接快速调用结果,而不用再去数需要的结果在第几个子组了。

$regex = &#39;/(?P<group1>\w(?P<group2>\w))abc(?P<group3>\w)45/&#39;;
$str = &#39;fsabcd45&#39;;
$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 = &#39;/(\w)(\w)\2\1/&#39;;    
$str = &#39;abba&#39;;
$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 >


了解了(?Ppattern)与\num,这个就不难理解了。\k< name >是对命名捕获组的反向引用。其中 name 是捕获组名。

$regex=&#39;/(?P<name>\w)abc\k<name>/&#39;;
$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),判断不存在使用(?

$regx=&#39;/(?<=a)bc(?=d)/&#39;;
$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 正则表达式效率 贪婪、非贪婪与回溯分析(推荐)

PHP 正则表达式常用函数使用

以上就是PHP之正则表达式捕获组与非捕获组的详解的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号