千家信息网

正则如何实现固化分组提高效率

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,这篇文章主要介绍了正则如何实现固化分组提高效率,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体来说,使用「(?>…)」的匹配与正常的
千家信息网最后更新 2025年12月01日正则如何实现固化分组提高效率

这篇文章主要介绍了正则如何实现固化分组提高效率,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

具体来说,使用「(?>…)」的匹配与正常的匹配并无差别,但是如果匹配进行到此结构之后(也就是,进行到闭括号之后),那么此结构体中的所有备用状态都会被放弃(不能被回溯)。
  也就是说,在固化分组匹配结束时,它已经匹配的文本已经固化为一个单元,只能作为整体而保留或放弃。括号内的子表达式中未尝试过的备用状态都不复存在了,所以回溯永远也不能选择其中的状态(至少是,当此结构匹配完成时,"锁定(locked in)"在其中的状态)。
例子:
  比如要处理一批数据,原来格式为123.456,后来因为浮点数显示问题,部分数据格式变为123.456000000789这种,,要求做到只保留小数点后面2-3位,但是,最后一位不能为0,这个正则如何写呢?(下面直接考虑小数点后面的数字),写出正则之后,我们还要用这个正则去匹配数据,把原来的数据替换成匹配的结果。

正则一、

代码如下:


$str = preg_replace('\.(\d\d[1-9]?)\d*','\\1',$str);
//匹配结果的group1进行反向引用


很明显,这种写法,对于部分数据格式为123.456的这种格式,白白的处理了一遍,为了提高效率,我们还要对这个正则进行处理。从123.456这个字符串跟其他的比较一下,我们发现,是疑问123.456这个数据后面没数字了,所以,白白处理一遍。那好办,我们对这个正则改造一下,把后面的量词*改成+,这样对于123.45 小数点后面1,2位数字的,不会去白白处理,而且,对三位以上数字的,处理正常。其PHP代码为

正则二、

代码如下:


$str = preg_replace('\.(\d\d[1-9]?)\d+','\\1',$str);


好了,这个正则真的没问题吗??下面,我们也分析一下这个正则的匹配过程吧。
  字符串"123.456",正则表达式为【\.(\d\d[1-9]?)\d+】,我们来看下

  首先(小数点前123不说了),
  【\.】匹配".",匹配成功,把控制权给下一个【\d】,【\d】匹配"4"成功,把控制权给第二个【\d】,这个【\d】匹配"5"成功,然后,把控制权给了【[1-9]?】,由于量词是【?】,正则表达式遵循"量词优先匹配",而且,此处是【?】,还会留下一个回溯点。然后匹配"6"成功,然后把控制权给【\d+】,【\d+】发现后面没字符了,最遵循"后进先出"规则,回到上一个回溯点,进行匹配,这时,【[1-9]?】会交还出其匹配的字符"6",【[1-9]?】匹配"6"成功。匹配完成了。大家发现【(\d\d[1-9]?)】匹配的结果确是"45",并不是我们想要的"456","6"被【\d+】匹配去了。那么,我们该如何办呢? 能否让【[1-9]?】匹配一旦成功,不进行回溯呢?这就用到了我们上面说的"固化分组", PHP(preg_replace函数)中使用的正则引擎支持固化分组,我们根据固化分组的写法,可以把代码改成如下方式

正则三、

代码如下:


$str = preg_replace('\.(\d\d(?>[1-9]?))\d+','\\1',$str);


改成这样的话,那字符串"123.456"是不符合要求,不会被匹配的。那我们就可以实现我们的要求了。

  所以,让我们来看(\.\d\d(?>[1-9]?))\d+。
  在固化分组内,量词能够正常工作,所以如果[1-9]不能匹配,正则表达式会返回? 留下的备用状态。然后匹配脱离固化分组,继续前进到「\d+」。在这种情况下,当控制权离开固化分组时,没有备用状态需要放弃(因为在固化分组中没有创建任何备用状态)。
  如果[1-9] 能够匹配,匹配脱离固化分组之后,「? 」保存的备用状态仍然存在。但是,因为它属于已经结束的固化分组,所以会被抛弃。
  匹配'.625'或者'.625000'时就会发生这种情况。在后一种情况下,放弃那些状态不会带来任何麻烦,因为「\d+」匹配的是'.625000',到这里正则表达式已经完成匹配。但是对于'.625'来说,因为「\d+」无法匹配,正则引擎需要回溯,但回溯又无法进行,因为备用状态已经不存在了。既然没有能够回溯的备用状态,整体匹配也就失败,'.625'不需要处理,而这正是我们期望的。

感谢你能够认真阅读完这篇文章,希望小编分享的"正则如何实现固化分组提高效率"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

正则 分组 状态 备用 处理 成功 数据 代码 字符 控制权 控制 小数 小数点 数字 格式 篇文章 表达式 量词 效率 字符串 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全应急响应技术工程师 查看系统中所有数据库 央视12套关于网络安全 工业互联网弘讯科技有限公司 软件开发策划方案怎么写 杭州计算机应用软件开发怎么样 温江区云豹软件开发工作室 网络安全计算机病毒的启动方式 微软的服务器防护软件 山西网络安全知识答案 操作系统占有率统计服务器 中年人学软件开发 游戏王决斗链接玩哪个服务器 怎么回到云服务器的桌面 泗洪网络安全大队电话 中国网络安全局组长 电脑如何切换网络安全模式 服务器如何返回数据 吕梁审计局网络安全设备 移动硬盘支持网页服务器的路由器 永恒纪元忘记服务器怎么办 app 服务器设计与实现 学院举行网络安全知识竞赛 和平精英更新服务器教学 宿迁威力网络技术市场 如何处理数据库连接问题 无锡 直销软件开发 公司信息网络技术工程 网络安全为人民短语 济南迪卡软件开发有限公司
0