关于正则表达式分组的一个问题

先来看一段php代码:

<?php
$pattern = '/(\d+\.?)+/';   //regular expression
$string = '192.168.210';
if (preg_match_all($pattern, $string, $arr))
{
    echo 'Matching well<br />';
    echo '<pre>';
    print_r($arr);
    echo '</pre>';
}
else
{
    echo '<font color="red">Matching failure.</font><br />';
}
?>
显示结果:


因为表达式(\d+\.?)+存在量词+,整个正则的匹配是一次性的。在整个正则表达式的匹配过程中,括号内的\d+\.?会多次匹配:第一次匹配192.,第二次匹配168.,第三次(也就是最后)匹配210,最终这个捕获分组匹配的文本就是210,最后的捕获分组中匹配的文本就是210

当把(\d+\.?)+的量词+去掉后,得到的是:


当调用preg_match_all()后,分重复三次不同的匹配,第一次是匹配字符串192.168.210,第二次匹配168.210,最后是210。那么最后捕获分组$arr中会有三个分组匹配值192.168.210。捕获分组的个数是不能动态变化的,单个正则表达式里有多少个捕获分组,一次匹配成功之后,结果中就必然存在多少个对应的元素(匹配的文本)。

参考 余晟 的 《正则指引》


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值