正则表达式进阶,零宽正回顾断言,零宽负回顾断言
零宽断言,表示匹配字符的时候再添加一些定位条件,使匹配更精准,但又不匹配到字符串。简单来说,零宽断言只做判断,不消耗字符。
四种零宽断言
| 名称 | 示例 | 解释 | 匹配举例 |
|---|---|---|---|
| 零宽正先行断言 (Positive Lookahead) | \w+(?=ing) |
匹配后面紧跟 ing 的单词前缀,不包括 ing 本身 |
talking → talk,singing → sing,king → 不匹配(k 前无 \w+) |
| 零宽负先行断言 (Negative Lookahead) | \w+(?!ing) |
匹配后面不跟 ing 的多个字符 |
do talking → do,hello → hello,run → run |
| 零宽正回顾断言 (Positive Lookbehind) | (?<=re)\w+ |
匹配前面紧跟 re 的多个字符,不包括 re 本身 |
redo → do,return → turn,research → search |
| 零宽负回顾断言 (Negative Lookbehind) | (?<!re)\w+ |
匹配前面不是 re 的单词 |
refreshing weather → weather,hello world → hello、world |
组合使用
零宽断言可以组合起来,同时约束前后条件:
(?<=\s)\d+(?=\s) 匹配两边是空白符的数字,不包括空白符,相当于Vim中在单词上按下*号的结果
更多组合举例:
| 示例 | 解释 | 匹配举例 |
|---|---|---|
(?<=\$)\d+ |
匹配美元符号后面的数字 | $100 → 100,€50 → 不匹配 |
\d+(?=%) |
匹配百分号前面的数字 | 80% → 80,100%off → 100 |
(?<=\[)\w+(?=\]) |
匹配方括号内的内容 | [INFO] → INFO,[ERROR] → ERROR |
另外,推荐一个测试正则表达式的网站: Regexr
regex,是正则regular expression的缩写,加上r就当是被正则坑的人的意思吧😂