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