正则表达式——断言

正则表达式引擎在执行字符串和表达式匹配时,会从头到尾(从前到后)连续扫描字符串中的字符,设想有一个扫描指针指向字符边界处并随匹配过程移动。

对这4个断言形式的记忆:

  • 先行和后行:后行断言(?<=pattern)、(?<!pattern)中,有个小于号,同时也是箭头,对于自左至右的文本方向,这个箭头是指向后的,这也比较符合我们的习惯。把小于号去掉,就是先行断言。

    先行(lookahead),是当扫描指针位于某处时,引擎会尝试匹配指针还未扫过的字符,先于指针到达该字符,故称为先行。

    后行(lookbehind),是当扫描指针位于某处时,引擎会尝试匹配指针已扫过的字符,后于指针到达该字符,故称为后行。

  • 正向和负向:不等于(!=)、逻辑非(!)都是用!号来表示,所以有!号的形式表示不匹配、负向;将!号换成=号,就表示匹配、正向。

    正向(positive)就表示匹配括号中的表达式

    负向(negative)就表示不匹配括号中的表达式

类目 表达式 含义
正向先行断言 A(?=X) 匹配后面是X的A
负向先行断言 A(?!X) 匹配后面不是X的A
正向后行断言 (?<=X)A 匹配前面是X的A
负向后行断言 (?<!X)A 匹配前面不是X的A

举例:

类型 实例 实例解释 结果
正向先行 (T|t)he(?=\sfat) 匹配后面是( fat)的(The|the) “(T|t)he(?=\sfat)” => The fat cat sat on the mat.
负向先行 (T|t)he(?!\sfat) 匹配后面不是( fat)的(The|the) “(T|t)he(?!\sfat)” => The fat cat sat on the mat.
正向后行 (?<=(T|t)he\s)(fat|mat) 匹配前面是(The|the)的所有(fat&mat)单词 “(?<=(T|t)he\s)(fat|mat)” => The fat cat sat on the mat.
负向后行 (?<!(T|t)he\s)(cat) 匹配前面不是(The|the)的所有(cat)单词 “(?<!(T|t)he\s)(cat)” => The cat sat on cat.

Leave a Reply

Your email address will not be published. Required fields are marked *