外观
4. 零宽度断言(前后预查)
先行断言和后发断言(合称 lookaround)都属于非捕获组(用于匹配模式,但不包括在匹配列表中)。当我们需要一个模式的前面或后面有另一个特定的模式时,就可以使用它们。
例如,我们希望从下面的输入字符串 $4.44
和 $10.88
中获得所有以 $
字符开头的数字,我们将使用以下的正则表达式 (?<=\$)[0-9\.]*
。意思是:获取所有包含 .
并且前面是 $
的数字。
零宽度断言如下:
符号 | 描述 |
---|---|
?= | 正先行断言-存在 |
?! | 负先行断言-排除 |
?<= | 正后发断言-存在 |
?<! | 负后发断言-排除 |
4.1 ?=...
正先行断言
?=...
正先行断言,表示第一部分表达式之后必须跟着 ?=...
定义的表达式。
返回结果只包含满足匹配条件的第一部分表达式。 定义一个正先行断言要使用 ()
。在括号内部使用一个问号和等号: (?=...)
。
正先行断言的内容写在括号中的等号后面。 例如,表达式 (T|t)he(?=\sfat)
匹配 The
和 the
,在括号中我们又定义了正先行断言 (?=\sfat)
,即 The
和 the
后面紧跟着 (空格)fat
。
"(T|t)he(?=\sfat)" => The fat cat sat on the mat.
4.2 ?!...
负先行断言
负先行断言 ?!
用于筛选所有匹配结果,筛选条件为 其后不跟随着断言中定义的格式。 正先行断言
定义和 负先行断言
一样,区别就是 =
替换成 !
也就是 (?!...)
。
表达式 (T|t)he(?!\sfat)
匹配 The
和 the
,且其后不跟着 (空格)fat
。
"(T|t)he(?!\sfat)" => The fat cat sat on the mat.
4.3 ?<= ...
正后发断言
正后发断言 记作(?<=...)
用于筛选所有匹配结果,筛选条件为 其前跟随着断言中定义的格式。 例如,表达式 (?<=(T|t)he\s)(fat|mat)
匹配 fat
和 mat
,且其前跟着 The
或 the
。
"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
4.4 ?<!...
负后发断言
负后发断言 记作 (?<!...)
用于筛选所有匹配结果,筛选条件为 其前不跟随着断言中定义的格式。 例如,表达式 (?<!(T|t)he\s)(cat)
匹配 cat
,且其前不跟着 The
或 the
。
"(?<!(T|t)he\s)(cat)" => The cat sat on cat.
上次更新: