PHP的正则表达式捕获和非捕获组(详细的解决方案)
我们知道,一个正则表达式在(x)是一个matching'x'and一个匹配值的记录的一种表示。这是一个比较流行的说法,甚至这是不严谨的,只有()的捕获组的形式将记录匹配的值。捕获组的比赛,不记录非。
捕获组:
(模式)
此表单是我们看到最多的表单,匹配和返回捕获结果可以嵌套,从左到右依次排列。
复制代码代码如下所示:
正则表达式=美元/(AB(C)+ D(E));
$str = 'abccde;
$ =数组();
如果(preg_match($ regex,$str,$matches)){
print_r($匹配);
}
匹配结果:
复制代码代码如下所示:
阵列({ 0 } { 1 } = = > > abccde ABCC { 2 } = { 3 } = > > C E)
(模式)
这种方式虽然在构造正则表达式时看起来有点复杂,但基本上与(模式)相同,最大的优点体现在结果处理中。程序员可以根据自己的设置直接而快速地调用结果,而不是计算前几个子组所需的结果。
复制代码代码如下所示:
正则表达式=美元/(P w(P w))ABC(P 45 / W);
$str = 'fsabcd45;
$ =数组();
如果(preg_match($ regex,$str,$matches)){
print_r($匹配);
}
匹配结果:
复制代码代码如下所示:
阵列({ 0 } {组} = > fsabcd45 = > FS { 1 } = { } = > > FS组的{ 2 } = { } = > >的3 D { 3 } = > D)
嗯
数值是一个对捕获组的反向引用的整数。例如,2代表匹配值的第二个子组,它代表第一个子组匹配值。
复制代码代码如下所示:
$正则表达式=( W)/( w) 2 1 ;
$str = 'abba;
$ =数组();
如果(preg_match($ regex,$str,$matches)){
print_r($匹配);
}
匹配结果:
复制代码代码如下所示:
阵列({ 0 } { 1 } = >阿爸= >一{ 2 } = > B)
注意,我漏掉了一个小细节。在开始的时候,我的第一个代码为正则表达式= /( w)( W) 2 1 /;返回的结果不匹配的结果,经过调试,发现它只能使用。我们需要注意的区别和用法。
◎K
这不难理解(模式)和是一个名为捕获组的反向引用。名称是捕获组的名称。
复制代码代码如下所示:
正则表达式=美元/(P w)ABC K ;
$str =fabcf ;
回声preg_match_all($ regex,$str,$matches);
print_r($匹配);
匹配结果:
复制代码代码如下所示:
阵列({ 0 } =阵列({ 0 } {姓名} = = fabcf)阵列({ 0 } = F){ 1 } =阵列({ 0 } = F))
非俘获群:
(::模式)
唯一的区别是(模式)与模式匹配,但没有捕获匹配结果。
我们实际上有四种方式谈论一件事:预览。
预考分为正向和反向的预检预检。按字面理解,正向查找是否有匹配的字符串后面的一些特点,和反向预览是确定是否有匹配的字符串前的一些特征。
积极的预判断存在(=模式),和判断不存在(!模式)。
反向预检判断存在(<=模式),和判断不存在(<!模式)。
复制代码代码如下所示:
regx美元= /(<=一)BC(= D);
$str =ABCD EBCD ABCE EBCA ;
如果(preg_match_all($ regx,$str,$matches)){
print_r($匹配);
}
匹配结果:
复制代码代码如下所示:
数组({ 0 } =数组({ 0 } = BC))
无论这四种形式是否被使用,只要注意相对匹配字符串的位置和断言的肯定或否定,就会很快掌握。
此外,前四种形式检查零宽度,只有一个判决时进行匹配是匹配的,而不是被本身。/他(= L)LLO / /火柴你好,和他(= L)罗/不匹配啊。毕竟,字节数是不匹配的,前者只有4,后者5。
以上是PHP正则表达式捕获组和非捕获组的全部内容,希望能对您有所启发。