断言(前瞻后瞻) - php 表达式
断言(前瞻后瞻)
一个断言就是一个对当前匹配位置之前或之后的字符的测试,它不会实际消耗任何字符。简单的断言代码有\b
、\B
、\A
、\Z
、\z
、^
、$
等等。更加复杂的断言以子组的方式编码。它有两种类型:前瞻断言(从当前位置向前测试)和后瞻断言(从当前位置向后测试)。
前瞻断言
一个断言子组的匹配还是通过普通方式进行的,不同在于它不会导致当前的匹配点发生改变。
- 前瞻断言中的正面断言以
?=
开始,断言此匹配为真。 - 前瞻断言中的消极断言以
?!
开始。
比如,\w+(?=;)
匹配一个单词紧跟着一个分号(;),但是匹配捕获的最终结果中不会包含分号,foo(?!bar)
匹配所有后面没有紧跟“bar”的“foo”字符串。
TRUE
。后瞻断言
- 后瞻断言中的正面断言以
?开始。
比如,(?用于查找任何前面不是“foo”的“bar”。
匹配固定长字符串
后瞻断言的内容被严格限制为只能用于匹配定长字符串。但是,如果有多个可选分支,它们不需要拥有相同的长度。比如 在最上级分支可以匹配不同长度的字符串是允许的。相比较于 perl 5.005 而言,它会要求多个分支使用相同长度的字符串匹配。(?(? 这种情况下,第一个断言查看(当前匹配点)前面的 6 个字符,检查前三个是数字,然后第二个断言检查(当前匹配点)前三个字符不是“999”。 断言可以以任意复杂度嵌套。比如 断言子组时非捕获子组,并且不能用量词修饰,因为对同一件事做多次断言是没有意义的。如果所有的断言都包含一个捕获子组,那么为了在整个模式中捕获子组计数的目的,它们都会被计算在内。然而,子字符串的捕获仅可以用于正面断言,因为对于消极的断言是没有意义的。通俗的讲,它不匹配字符串,而是匹配一个位置。 将断言计算在内,可以拥有的最大子组数量是 200 个。 比如匹配不包含字符串ab的行写法就应该如下: 如果匹配不包含ab的某一行的话,就是如下写法:(?
任意复杂度嵌套
(?(?
不捕获子组内容,仅仅是预览
匹配不包含字符串的写法
((?!ab).)*
,意思是零次或者多次的匹配。^((?!ab).)*$
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!