一个断言就是一个对当前匹配位置之前或之后的字符的测试, 它不会实际耗损任何字符. 简朴的断言代码有\b, \B, \A, \Z, \z, ^, $等等. 越发巨大的断言以子组的方法编码. 它有两种范例: 前瞻断言(从当前位置向前测试)和后瞻断言(从当前位置向后测试)
一个断言子组的匹配照旧通过普通方法举办的, 差异在于它不会导致当前的匹配点产生改变. 前瞻断言中的正面断言(断言此匹配为真)以”(?=”开始, 消极断言以”(?!”开头. 好比, \w+(?=;)匹配一个单词紧随着一个分号可是匹配功效不会包括分号, foo(?!bar)匹配所有后头没有紧跟”bar”的”foo”字符串. 留意一个雷同的模式(?!foo)bar, 它不能用于查找之前呈现所有不是”foo”的”bar”匹配, 它会查找到任意的”bar”呈现的环境, 因为(?!foo)这个断言在接下来三个字符时”bar”的时候是永远都TRUE的. 前瞻断言需要到达的就是这样的结果.
后瞻断言中的正面断言以”(?<=”开始, 消极断言以”(?<!”开始. 好比, (?<!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”
断言可以以任意巨大度嵌套. 好比(?<=(?<!foo)bar)baz匹配前面有”bar”可是”bar”前面没有”foo”的”baz”. 别的一个模式(?<=\d{3}…(?<!999))foo则匹配前面有三个数字字符紧跟3个不是999的任意字符的”foo”.
断言子组时非捕捉子组, 而且不能用量词修饰, 因为对同一件事做多次断言是没有意义的.假如所有的断言都包括一个捕捉子组, 那么为了在整个模式中捕捉子组计数的目标, 它们城市被计较在内. 然而, 子字符串的捕捉仅可以用于正面断言, 因为对付消极的断言是没有意义的.
将断言计较在内, 可以拥有的最大子组数量是200个.