原文链接:vim零宽断言
vim 中使用零宽度断言,包括
符号 | vim符号 | 描述 | 示例 | vim示例 |
---|---|---|---|---|
?= | \@= | 正先行断言-存在 | foo(?=bar) | foo\ (bar\ )\@= |
?! | \@! | 负先行断言-排除 | foo(?!bar) | foo\ (bar\ )\@! |
?<= | \@<= | 正后发断言-存在 | (?<=foo)bar | \ (foo\ )\@<=bar |
?<! | \@<! | 负后发断言-排除 | (?<!foo)bar | \ (foo\ )\@<!bar |
零宽度断言(前后预查)
先行断言和后发断言都属于非捕获簇(不捕获文本 ,也不针对组合计进行计数)。
先行断言用于判断所匹配的格式是否在另一个确定的格式之前,匹配结果不包含该确定格式(仅作为约束)。
例如,我们想要获得所有跟在 $
符号后的数字,我们可以使用正后发断言 (?<=\$)[0-9\.]*
。
这个表达式匹配 $
开头,之后跟着 0,1,2,3,4,5,6,7,8,9,.
这些字符可以出现大于等于 0 次。
?=...
正先行断言
?=...
正先行断言,表示第一部分表达式之后必须跟着 ?=...
定义的表达式。
返回结果只包含满足匹配条件的第一部分表达式。
定义一个正先行断言要使用 ()
. 在括号内部使用一个问号和等号:(?=...)
。
正先行断言的内容写在括号中的等号后面。
例如,表达式 (T|t)he(?=\sfat)
匹配 The
和 the
, 在括号中我们又定义了正先行断言 (?=\sfat)
, 即 The
和 the
后面紧跟着 \nfat
。
“(T|t)he(?=\sfat)” => The fat cat sat on the mat.
?!...
负先行断言
负先行断言 ?!
用于筛选所有匹配结果,筛选条件为 其后不跟随着断言中定义的格式。
正先行断言 定义和 负先行断言 一样,区别就是 =
替换成 ``! 也就是 (?!...)
。
表达式 (T|t)he(?!\sfat)
匹配 The
和the
, 且其后不跟着 \nfat
。
“(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)(fat|mat)
匹配 fat
和 mat
, 且其前跟着 The
或 the
。
负后发断言 记作 (?<!...)
用于筛选所有匹配结果,筛选条件为 其前不跟随着断言中定义的格式。
例如,表达式 (?<!(T|t)he\s)(cat)
匹配 cat
, 且其前不跟着 The
或 the
。
“(?<!(T|t)he\s)(cat)” => The cat sat on cat.