Skip to content

4. 零宽度断言(前后预查)

先行断言和后发断言(合称 lookaround)都属于非捕获组(用于匹配模式,但不包括在匹配列表中)。当我们需要一个模式的前面或后面有另一个特定的模式时,就可以使用它们。

例如,我们希望从下面的输入字符串 $4.44$10.88 中获得所有以 $ 字符开头的数字,我们将使用以下的正则表达式 (?<=\$)[0-9\.]*。意思是:获取所有包含 . 并且前面是 $ 的数字。

零宽度断言如下:

符号描述
?=正先行断言-存在
?!负先行断言-排除
?<=正后发断言-存在
?<!负后发断言-排除

4.1 ?=... 正先行断言

?=... 正先行断言,表示第一部分表达式之后必须跟着 ?=...定义的表达式。

返回结果只包含满足匹配条件的第一部分表达式。 定义一个正先行断言要使用 ()。在括号内部使用一个问号和等号: (?=...)

正先行断言的内容写在括号中的等号后面。 例如,表达式 (T|t)he(?=\sfat) 匹配 Thethe,在括号中我们又定义了正先行断言 (?=\sfat) ,即 Thethe 后面紧跟着 (空格)fat

"(T|t)he(?=\sfat)" => The fat cat sat on the mat.

在线练习

4.2 ?!... 负先行断言

负先行断言 ?! 用于筛选所有匹配结果,筛选条件为 其后不跟随着断言中定义的格式。 正先行断言 定义和 负先行断言 一样,区别就是 = 替换成 ! 也就是 (?!...)

表达式 (T|t)he(?!\sfat) 匹配 Thethe,且其后不跟着 (空格)fat

"(T|t)he(?!\sfat)" => The fat cat sat on the mat.

在线练习

4.3 ?<= ... 正后发断言

正后发断言 记作(?<=...) 用于筛选所有匹配结果,筛选条件为 其前跟随着断言中定义的格式。 例如,表达式 (?<=(T|t)he\s)(fat|mat) 匹配 fatmat,且其前跟着 Thethe

"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.

在线练习

4.4 ?<!... 负后发断言

负后发断言 记作 (?<!...) 用于筛选所有匹配结果,筛选条件为 其前不跟随着断言中定义的格式。 例如,表达式 (?<!(T|t)he\s)(cat) 匹配 cat,且其前不跟着 Thethe

"(?<!(T|t)he\s)(cat)" => The cat sat on cat.

在线练习

4. 零宽度断言(前后预查)已经加载完毕