正则表达式——断言v2

正则表达式断言指南

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

对这 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 *