断言(Assertion)中常用的正则表达式
1. 边界类断言
- **
^
(开头)**: 匹配字符串起始位置。^abc // 匹配以"abc"开头的字符串
- **
$
(结尾)**: 匹配字符串结束位置。abc$ // 匹配以"abc"结尾的字符串
- **
\b
(单词边界)**: 匹配单词与非单词字符(如空格、标点)之间的位置。\bcat\b // 匹配独立的单词"cat"(前后无其他字母)
- **
\B
(非单词边界)**: 匹配非单词边界(如连续字母之间)。\Bcat\B // 匹配"scatter"中的"cat"(前后均有字母)
2. 前瞻断言(Lookahead)
- **
(?=...)
(正向前瞻)**: 后续必须匹配表达式。a(?=bc) // 匹配后面紧跟着"bc"的"a"(如"abc")
- **
(?!...)
(负向前瞻)**: 后续不能匹配表达式。a(?!bc) // 匹配后面不是"bc"的"a"(如"ad")
3. 后顾断言(Lookbehind)
- **
(?<=...)
(正向后顾)**: 前面必须匹配表达式。(?<=a)bc // 匹配前面是"a"的"bc"(如"abc")
- **
(?<!...)
(负向后顾)**: 前面不能匹配表达式。(?<!a)bc // 匹配前面不是"a"的"bc"(如"xbc")
※ 注意:后顾断言在部分编程语言中不支持复杂表达式(如 Python 需固定长度,JavaScript 部分版本有限制)。
4. 示例应用场景
- 验证密码强度(至少一个大写字母、数字):
^(?=.*[A-Z])(?=.*\d).{8,}$ // 匹配8位以上,且含大写字母和数字的密码
- 提取不在引号中的关键词:
\bkeyword\b(?=(?:[^"]*"[^"]*")*[^"]*$) // 匹配未在双引号内的"keyword"
- 匹配特定分隔符之间的内容:
(?<=@)\w+ // 匹配"@username"中的"username"
注意事项
- 兼容性:后顾断言(Lookbehind)在旧环境(如 IE)中可能不被支持。
- 零宽度:断言只验证位置,不占用字符。
- 性能:复杂断言可能影响正则效率,建议测试优化。
通过合理使用断言,可以精确控制匹配逻辑,处理复杂边界条件或依赖上下文的内容验证