固化分组
来源:互联网 发布:ubuntu修改文件拥有者 编辑:程序博客网 时间:2024/04/27 21:33
具体来说,使用「(?>…)」的匹配与正常的匹配并无差别,但是如果匹配进行到此结构之后(也就是,进行到闭括号之后),那么此结构体中的所有备用状态都会被放弃。也就是说,在固化分组匹配结束时,它已经匹配的文本已经固化为一个单元,只能作为整体而保留或放弃。括号内的子表达式中未尝试过的备用状态都不复存在了,所以回溯永远也不能选择其中的状态(至少是,当此结构匹配完成时,“锁定(locked in)”在其中的状态)。
字符串"123.456",正则表达式为\.(\d\d[1-9]?)\d+,我们来看下
首先(小数点前123不说了),\.匹配".",匹配成功,把控制权给下一个\d,\d匹配“4”成功,把控制权给第二个\d,这个\d匹配“5”成功,然后,把控制权给了[1-9]?,由于量词是【?】,正则表达式遵循“量词优先匹配”,而且,此处是?,还会留下一个回溯点。然后匹配"6"成功,然后把控制权给\d+,\d+发现后面没字符了,最遵循“后进先出”规则,回到上一个回溯点,进行匹配,这时,[1-9]?会交还出其匹配的字符“6”,\d+匹配“6”成功。匹配完成了。
大家发现【(\d\d[1-9]?)】匹配的结果确是"45",并不是我们想要的“456”,“6”被\d+匹配去了。那么,我们该如何办呢? 能否让[1-9]?匹配一旦成功,不进行回溯呢?这就用到了我们上面说的"固化分组", PHP(preg_replace函数)中使用的正则引擎支持固化分组,我们根据固化分组的写法,可以把代码改成如下方式:\.(\d\d(?>[1-9]?))\d+,改成这样的话,那字符串“123.456“是不符合要求,不会被匹配的。那我们就可以实现我们的要求了。
所以,让我们来看(\.\d\d(?>[1-9]?))\d+。
在固化分组内,量词能够正常工作,所以如果[1-9]不能匹配,正则表达式会返回? 留下的备用状态。然后匹配脱离固化分组,继续前进到「\d+」。在这种情况下,当控制权离开固化分组时,没有备用状态需要放弃(因为在固化分组中没有创建任何备用状态)。
如果[1-9] 能够匹配,匹配脱离固化分组之后,「? 」保存的备用状态仍然存在。但是,因为它属于已经结束的固化分组,所以会被抛弃。
匹配‘.625'或者‘.625000'时就会发生这种情况。在后一种情况下,放弃那些状态不会带来任何麻烦,因为「\d+」匹配的是‘.625000',到这里正则表达式已经完成匹配。但是对于‘.625'来说,因为「\d+」无法匹配,正则引擎需要回溯,但回溯又无法进行,因为备用状态已经不存在了。既然没有能够回溯的备用状态,整体匹配也就失败,‘.625'不需要处理,而这正是我们期望的。
- 固化分组
- 固化分组和占有量词
- 正则表达式占有优先量词以及固化分组的使用
- 正则表达式——肯定环视模拟固化分组
- 精通正则表达式七:占有优先量词和固化分组
- 正则表达式之二——捕获组、非捕获组、环视、固化分组、反向引用、回溯
- 软件固化
- 固化程序
- bootloader如何固化?
- 人,不能固化自己。。
- DM355文件系统固化
- oracle 固化视图
- 【现象】阶层固化
- omap3530 系统固化
- lpc3250linux固化流程
- Kettle数据固化流程
- FPGA固化方法
- AOF方式固化
- Android学习日记--Java练习题
- MYSQL最近一周一个月时间段的查询语句
- 谈下自己编程的一些能力,还是有一点点的
- 学习笔记-Java习题
- sql注入
- 固化分组
- git 学习之管理修改
- 接口的implements和接口的extends怎么理解
- OpenCV学习笔记(一):生成随机矩阵
- 分布式设计《hessian集成spring的应用》
- ORA-14402: 更新分区关键字列将导致分区的更改。
- C++ 将string字符串按照特殊的多个字符分割
- 查询表中不同名字的数据的第一条
- 虚拟机桥接无法自动获取IP的解决方法