预查和后瞻是用于确认位置的断言,不消耗字符也不出现在结果中;正向预查x(?=y)匹配x且其后紧接y,负向预查x(?!y)匹配x且其后不紧接y,正向后瞻(?

预查(Lookahead)和后瞻(Lookbehind)不是用来“抓取”内容的,而是用来“确认位置”的——它们检查某个位置前后是否满足条件,自身不消耗字符,也不出现在最终匹配结果里。掌握这四类断言,就能精准控制“什么情况下才匹配”,而不是盲目找字符串。
正向预查:只在后面符合条件时才匹配
语法是 X(?=Y),意思是:匹配 X,但仅当 X 后面紧跟着能被 Y 匹配的文本时才成功。Y 本身不参与匹配,也不出现在结果中。
- 比如 \d+(?=€) 能从
"1 turkey costs 30€"中提取出"30",但不会匹配到"1"(因为后面是空格,不是 €) - 再如 re(?=gular) 可以精准匹配单词
"regular"中的"re",而跳过"expression"里的"re" - 多个正向预查可叠加:\d+(?=\s)(?=.*30) 表示匹配一个数字,它后面要有空格,且整行还要包含 "30"
负向预查:后面不符合条件时才匹配
语法是 X(?!Y),表示:匹配 X,但要求 X 后面**不能**紧跟着 Y 所描述的内容。
-
\d+\b(?!元) 可用于提取“非货币单位”的数字,例如在
"价格:128元,编号:997"中只匹配"997" -
grey(?!hound) 能匹配
"the grey socks"中的"grey",但跳过"greyhound"里的"grey" - 注意:负向预查容易误用——它否定的是“紧邻之后”,不是“整行不出现”。想排除整行含某词,需结合
^和$
正向后瞻:前面符合条件才匹配
语法是 (?,即:匹配 X,但前提是 X 前面紧挨着能被 Y 匹配的文本。Y 不被捕获,也不移动匹配位置。
- (? 在
"babcab"中能精准定位第二个"b"(它左边是"a",右边是"c") - (? 可提取带美元符号的价格数字,如
"Cost: $29.99"中的"29.99" - PCRE1(旧版工具)要求后瞻中的 Y 必须是固定长度;PCRE2(Notepad++ v7.9+、现代 JS/Python)已支持变长,但像
(? 仍可能受限
负向后瞻:前面不符合条件才匹配
语法是 (?,表示:匹配 X,但 X 左边**不能**紧挨着 Y 所描述的内容。
- (? 在
"the hound is not a greyhound"中匹配独立的"hound",但跳过"greyhound"里的"hound" - 常用于避免误匹配转义字符,例如提取未被反斜杠转义的引号:(?
- JavaScript 自 ES2018 起全面支持后瞻,但部分老环境或工具(如早期 Notepad++)仍不兼容,使用前建议验证











