正则表达式-零宽度断言

Author Avatar
丁起男 11月 30,2020
  • 在其它设备中阅读本文章

正则表达式-零宽度断言

先行断言和后发断言都属于非捕获簇(不捕获文本,也不针对组合进行计数)。

先行断言用于判断所匹配的格式是否在另一个确定的格式之前,匹配结果不包含该确定格式(仅作为约束)。

例如,我们想要获得所有跟在$符号后的数字,我们可以使用正后发断言(?<=\s)[0-9\.]

这个表达式匹配$,之后跟着0-9和.,这些字符可以出现大于等于0次

正先行断言

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

返回结果只包含满足匹配条件的第一部分表达式。

定义一个正先行断言要使用()。在包括内部使用一个问号和等号:(?=...)

正先行断言的内容写在括号中的等号后面。

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

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

负先行断言

负先行断言?!用于筛选所有匹配结果,筛选条件为其后不跟随着断言中定义的格式。

正先行断言定义和负先行断言一样,区别就是=替换成了也就是(?!...)

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

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

正后发断言

正后发断言记作(?<=...)用于筛选所有匹配结果,筛选条件为其前跟随着断言中定义的格式。

例如:表达式(?<=(T|t)he\s)(fat|mat),匹配fat和mat,且其前跟着The或the。

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

负后发断言

负后发断言记作(?<!...)用于筛选所有匹配结果,筛选条件为其前不跟随着断言中定义的格式。

例如,表达式(?<!(T|t)he\s)(cat),且其前不跟着The或the。

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