0

0

php—PCRE正则表达式一次性子组

伊谢尔伦

伊谢尔伦

发布时间:2016-11-21 17:13:48

|

1556人浏览过

|

来源于php中文网

原创

对于同时有最大值和最小值量词限制的重复项, 在匹配失败后, 紧接着会以另外一个重复次数重新评估是否能使模式匹配。 当模式的作者明确知道执行上没有问题时, 通过改变匹配的行为或者使其更早的匹配失败以阻止这种行为是很有用的。

考虑一个例子,模式 \d+foo 应用到目标行 123456bar 时:

在匹配了 6 个数字后匹配 ”foo” 时失败,通常的行为时匹配器尝试使 \d+ 只匹配 5 个数字, 只匹配 4 个数字,在最终失败之前依次进行尝试。 一次性子组提供了一种特殊的意义, 当模式的一部分得到匹配后,不再对其进行重新评估, 因此匹配器在第一次匹配 ”foo” 失败后就能立刻失败。语法符号是另外一种特殊的括号, 以 (?> 开始,比如(?>\d+)bar。

这种括号对模式的一部分提供了”锁定”,当它包含一个匹配之后, 会阻止未来模式失败后对它内部的后向回溯。后向回溯在这里失效, 其他工作照常进行。

换一种说法,如果在目标字符串中当前匹配点是锚点, 这种类型的子组匹配的字符串等同于一个独立的模式匹配。

立即学习PHP免费学习笔记(深入)”;

CopyWeb
CopyWeb

AI网页设计转换工具,可以将屏幕截图、网站URL转换为代码组件

下载

一次性子组不是捕获子组。如上面的例子,简单而言, 就是尽其所能吃掉尽可能多的匹配字符。因此, 尽管 \d+ 和 \d+? 都会调整要匹配的数字的个数以便模式的其他部分匹配, (?>\d+) 却仅能匹配整个数字序列。

这个(语法)结构可以包含任意复杂度的字符, 也可以嵌套。

一次性子组可以和后瞻断言结合使用来指定在目标字符串末尾的有效匹配。 考虑当一个简单的模式比如abcd$应用到一个不匹配的长字符串上。 由于匹配时从左到右处理的,PCRE会从目标中查找每一个 ”a” 然后查看是否紧接着会匹配模式的剩余部分。 如果模式是^.*abcd$, 那么初始的 .* 将首先匹配整个字符串,但是当它失败后(因为紧接着不是 ”a”), 它会回溯所有的匹配,依次吐出最后 1 个字符,倒数第 2 个字符等等。 从右向左查找整个字符串中的 ”a”, 因此,我们不能很好的退出。然而, 如果模式写作 ^(?>.*)(?

当一个模式中包含一个子组自己可以无限重复并且内部有无限重复元素时, 使用一次性子组是避免一些失败匹配消耗大量时间的唯一途径。 模式 (\D+|)*[!?] 匹配一个不限制数目的非数字字符或由 闭合的数字字符紧跟着 ! 或 ?。 当它匹配的时候,运行时快速的。然而, 如果它应用到 ”aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa” 上将会在报告错误之前消耗很多时间。 这是因为字符串可以用于两种重复规则,并且需要为两种重复规则都分配进行尝试。 (示例的结尾使用 [!?] 而不是单个的字符, 是因为 PCRE 和 perl 都会对模式最后是一个单独字符时的快速报错有优化。 它们会记录最后需要匹配的单个字符,当它们没有出现在字符串中时快速报错。) 如果模式修改为 ((?>\D+)|)*[!?] 就会快速得到报错。(译注: 对于这里给出的模式,当目标字符串更长的时候,消耗时间会迅速增加,慎用。)

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

11

2026.01.12

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

106

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

64

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

139

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.09

俄罗斯手机浏览器地址汇总
俄罗斯手机浏览器地址汇总

汇总俄罗斯Yandex手机浏览器官方网址入口,涵盖国际版与俄语版,适配移动端访问,一键直达搜索、地图、新闻等核心服务。

93

2026.01.09

漫蛙稳定版地址大全
漫蛙稳定版地址大全

漫蛙稳定版地址大全汇总最新可用入口,包含漫蛙manwa漫画防走失官网链接,确保用户随时畅读海量正版漫画资源,建议收藏备用,避免因域名变动无法访问。

480

2026.01.09

php学习网站大全
php学习网站大全

精选多个优质PHP入门学习网站,涵盖教程、实战与文档,适合零基础到进阶开发者,助你高效掌握PHP编程。

52

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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