0

0

php—PCRE正则表达式重复/量词

伊谢尔伦

伊谢尔伦

发布时间:2016-11-21 17:18:22

|

1581人浏览过

|

来源于php中文网

原创

重复次数是通过量词指定的,可以紧跟在下面元素之后:

单独的字符, 可以是经过转义的

元字符。

字符类

后向引用(参加下一部分)

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

子组(除非它是一个断言)

一般的重复量词指定了一个最小数值和一个最大数值的匹配次数, 通过花括号包裹两个数字,两个数字之间用逗号隔开的语法定义。 两个数值都必须小于 65536, 并且第一个数字必须小于等于第二个。 比如: z{2,4} 匹配 ”zz”, “zzz”, “zzzz”。 单个的右花括号不是特殊字符。 如果第二个数字被省略,但是逗号仍然存在,就代表没有上限; 如果第二个数字和逗号都被省略,那么这个量词就限定的是一个确定次数的匹配。 比如 [aeiou]{3,} 匹配至少三个连续的元音字母,但是同时也可以匹配更多, 而 \d{8} 则只能匹配 8 个数字。 左花括号出现在不允许使用量词的位置或者与量词语法不匹配时, 被认为是一个普通字符,对它自身进行原文匹配。 比如,{,6}就不是一个量词, 会按照原文匹配四个字符 ”{,6}”。

量词 {0} 是被授权的,它会导致的行为是认为前面的项和量词不存在。

为了方便(以及历史的兼容性),最常用的三个量词都有单字符缩写。

单字符量词

*    等价于 {0,}    

+    等价于 {1,}    

小艺
小艺

华为公司推出的AI智能助手

下载

?    等价于 {0,1}    

可以通过一个不匹配任何字符的子模式后面紧跟一个匹配 0 或多个字符的量词来构造一个没有上限的无限循环。 比如:(a?)*

早期版本的 perl 和 pcre 对于这种模式会在编译期得到一个错误。然而, 由于这在某些情况下是有用的,因此现在也接受这种模式了, 但是如果任何子模式的重复确实匹配不到任何字符,循环会被强制跳出。

默认情况下,量词都是”贪婪”的,也就是说, 它们会在不导致模式匹配失败的前提下,尽可能多的匹配字符(直到最大允许的匹配次数)。 这种问题的典型示例就是尝试匹配C语言的注释。 出现在 /* 和 */ 之间的所有内容都被认为是注释, 在注释中间, 可以允许出现单独的 * 和 /。 对C注释匹配的一个尝试是使用模式 /\*.*\*/, 假设将此模式应用在字符串 ”/* first comment*/ not comment /*second comment*/” 它会匹配到错误的结果,也就是整个字符串, 这是因为量词的贪婪性导致的,它会尝试尽可能多的匹配字符。

然而,如果一个量词紧跟着一个 ?(问号) 标记,它就会成为懒惰(非贪婪)模式, 它不再尽可能多的匹配,而是尽可能少的匹配。 因此模式 /\*.*?\*/ 在 C 的注释匹配上将会正确的执行。 各个量词自身的意义并不会改变,而是由于加入了 ? 使其首选的匹配次数发生改变。 不要将 ? 的这个用法和它作为量词的用法混淆。因为它又两种用法, 因此有时它会出现量词,比如 \d??\d 会更倾向于匹配一个数字, 但同时如果为了达到整个模式匹配的目的,它也可以接受两个数字的匹配。译注: 以模式 \w\d??\d\w 为例,对于字符串 ”a33a”,虽然 \d?? 是非贪婪的, 但由于如果使用贪婪会导致整个模式不匹配,所以, 最终它选择的仍然是匹配到一个数字。

如果 PCRE_UNGREEDY 选项被设置(一个在 perl 中不可用的选项), 那么量词默认情况下就是非贪婪的了。但是, 单个的量词可以通过紧跟一个 ? 来使其成为贪婪的。换句话说, PCRE_UNGREEDY 这个选项逆转了贪婪的默认行为。

量词后面紧跟一个 ”+” 是”占有”性。它会吃掉尽可能多的字符, 并且不关注后面的其他模式,比如 .*abc 匹配 ”aabc”, 但是 .*+abc 不会匹配, 因为 .*+ 会吃掉整个字符串,从而导致后面剩余的模式得不到匹配。 自PHP 4.3.3 起, 可以使用占有符 (+) 修饰量词来达到提升速度的目的。

当一个子组受最小数量大于 1 或有一个最大数量限制的量词修饰时, 按照最小或最大的数量的比例需要更多的存储用于编译模式。

如果一个模式以 .* 或 .{0,} 开始并且 PCRE_DOTALL 选项开启(等价于 perl 的/s), 也就是允许.匹配换行符,那么模式会隐式的紧固,因为不管怎么样, 接下来都会对目标字符串中的每个字符位置进行尝试,因此在第一次之后, 在任何位置都不会有一个对所有匹配重试的点。 PCRE 会想对待 \A 一样处理这个模式。 在我们已知目标字符串没有包含换行符的情况下, 当模式以 .* 开始的时候我们为了获得这个优化,值得设置 PCRE_DOTALL, 或者选择使用 ^ 明确指明锚定。

译注:这里的优化指模式不匹配之后,不会回头再来查找下一个位置, 比如没有设置 PCRE_DOTALL,并且目标字符串第一个字符时换行符, 那么模式尝试第一个字符,发现不匹配, 会重新用模式从第二个字符位置开始进行尝试。 而使用了PCRE_DOTALL后, 是肯定匹配的….同理,当使用了 ^ 或者 /A的限定是,模式一旦不匹配,都可以直接退出, 而不用在目标字符串下一个位置再一次开始整个模式的匹配。

当一个捕获子组时重复的时,捕获到的该子组的结果是最后一次迭代捕获的值。比如, (tweedle[dume]{3}\s*)+匹配字符串 ”tweedledum tweedledee”, 得到的的子组捕获结果是 ”tweedledee”。然而,如果是嵌套的捕获子组, 相应的捕获值可能会被设置到之前的迭代中。比如,/(a|(b))+/ 匹配字符串 ”aba”, 第二个捕获子组得到的结果会是 ”b”。译注:不理解然而之后的部分,以例子说明, b 是第二个子组最后一次捕获到的结果,所以, 第二个子组最后结果是 b, 这是符合”然而”之前描述的规则的。

相关文章

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

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

下载

相关标签:

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

21

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

106

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

50

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

87

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

27

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

79

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

61

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

50

2026.02.28

热门下载

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

精品课程

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

共137课时 | 13万人学习

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

共6课时 | 11.3万人学习

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

共13课时 | 1.0万人学习

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

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