php 正则断言

断言

一个断言就是一个对当前匹配位置以前或以后的字符的测试, 它不会实际消耗任何字符。简单的断言代码有\b、\B、 \A、 \Z、\z、 ^、$ 等等。 更加复杂的断言以子组的方式编码。 它有两种类型: 前瞻断言(从当前位置向前测试)和后瞻断言(从当前位置向后测试)。 javascript

一个断言子组的匹配仍是经过普通方式进行的, 不一样在于它不会致使当前的匹配点发生改变。 前瞻断言中的正面断言(断言此匹配为真)以 ”(?=” 开始消极断言以 ”(?!” 开头。好比, \w+(?=;) 匹配一个单词紧跟着一个分号可是匹配结果不会包含分号, foo(?!bar) 匹配全部后面没有紧跟 ”bar” 的 ”foo” 字符串。 注意一个相似的模式 (?!foo)bar, 它不能用于查找以前出现全部不是 ”foo” 的 ”bar” 匹配, 它会查找到任意的 ”bar” 出现的状况, 由于 (?!foo) 这个断言在接下来三个字符时 ”bar” 的时候是永远都 TRUE 的。 前瞻断言须要达到的就是这样的效果。 java

后瞻断言中的正面断言以”(?<=”开始, 消极断言以”(?<!”开始。好比, (?<!foo)bar 用于查找任何前面不是 ”foo” 的 ”bar”。 后瞻断言的内容被严格限制为只能用于匹配定长字符串。可是,若是有多个可选分支, 它们不须要拥有相同的长度。好比 (?<=bullock|donkey) 是容许的, 可是 (?<!dogs?|cats?) 将会引起一个编译期的错误。在最上级分支能够匹配不一样长度的字符串是容许的。 相比较于 perl 5.005 而言,它会要求多个分支使用相同长度的字符串匹配。 (?<=ab(c|de)) 这样的断言是不容许的, 由于它单个的顶级分支能够匹配两个不一样的长度, 可是它能够接受使用两个顶级分支的写法 (?<=abc|abde) 这样的断言实现, 对于每一个可选分支,暂时将当前位置移动到尝试匹配的当前位置以前的固定宽度处。 若是在当前没有足够的字符就视为匹配失败。后瞻断言与一次性子组结合使用能够用来匹配字符串结尾; 一个例子就是在一次性子组上给出字符串结尾。 测试

多个断言(任意顺序)能够同时出现。 好比 (?<=\d{3})(?<!999)foo 匹配前面有三个数字但不是 ”999” 的字符串 ”foo”。注意, 每一个断言独立应用到对目标字符串该点的匹配。 首先它会检查前面的三位都是数字, 而后检查这三位不是 ”999”。 这个模式不能匹配 ”foo” 前面有三位数字而后紧跟 3 位非 999 共 6 个字符的字符串,好比, 它不匹配 ”123abcfoo”。 匹配 ”123abcfoo” 这个字符串的模式能够是(?<=\d{3}…)(?<!999)foo编码

这种状况下,第一个断言查看(当前匹配点)前面的 6 个字符,检查前三个是数字, 而后第二个断言检查(当前匹配点)前三个字符不是 ”999”。 spa

断言能够以任意复杂度嵌套。 好比 (?<=(?<!foo)bar)baz 匹配前面有 ”bar” 可是 ”bar” 前面没有 ”foo” 的 ”baz”。 另一个模式 (?<=\d{3}…(?<!999))foo 则匹配前面有三个数字字符紧跟 3 个不是 999 的任意字符的 ”foo”。 ip

断言子组时非捕获子组,而且不能用量词修饰, 由于对同一件事作屡次断言是没有意义的.若是全部的断言都包含一个捕获子组, 那么为了在整个模式中捕获子组计数的目的,它们都会被计算在内。然而, 子字符串的捕获仅能够用于正面断言,由于对于消极的断言是没有意义的。 字符串

将断言计算在内,能够拥有的最大子组数量是 200 个。 编译


javascript不支持后瞻断言。 perl

相关文章
相关标签/搜索