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