前瞻断言是多条件并行检查机制,不消耗字符、不推进指针;用于精准提取(如价格数字)、密码强度校验、排除特定前缀邮箱等场景。

前瞻断言不是“多匹配一段”,而是“多检查一个条件”——它让正则能在不吞掉字符的前提下,确认后面有没有你想依赖的上下文。用对了,提取更干净;用错了,容易空匹配或逻辑反直觉。
提取数字但排除货币符号
常见需求:从“总价:¥199.99,折扣后¥89.5”中只取价格数字,不要¥符号。
- 错误写法:
\d+\.\d+→ 会匹配到199.99和89.5,但无法区分是否真属于价格 - 正确写法:
(?(后顾)或更通用的<code>\d+\.\d+(?=¥|€|\$)(前瞻)→ 但注意:后者方向反了,应是(?才对应“¥后面”的数字 - 更稳妥的前瞻用法:
\d+\.\d+(?=\s*(?:¥|€|\$))→ 匹配数字后紧跟着空白+货币符号,结果仍只是数字,符号不包含在内
替换特定上下文中的单词
比如把文档里所有“cat”,但仅限它后面跟着“dog”的情况替换成“lion”:
-
cat(?=\sdog)→ 匹配cat,前提是后面有空格+dog - 文本
the cat dog ran中,cat被匹配;而the cat ran中不匹配 - 若想排除
_cat这种带下划线前缀的,就得换用后顾:(?
密码强度多条件验证
要求密码必须同时含大写字母、小写字母、数字、特殊字符,且长度≥8:
- 单个正则搞定:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#\$%\^&\*]).{8,}$ - 每个
(?=.*...)都是一个正向前瞻,它们并列在开头,不消耗字符,只做“是否存在”的检查 - 最后的
.{8,}才是真正匹配主体,前面所有断言都通过才算整体成功
过滤掉以特定前缀开头的邮箱
从一串邮箱中提取所有非admin@和test@的地址:
\b(?!admin@|test@)[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b-
(?!admin@|test@)是负向前瞻,放在邮箱模式最前,确保匹配起点不紧接这两个前缀 -
\b保证边界,避免myadmin@example.com被误排除(因为admin@不在词首)
不复杂但容易忽略:前瞻断言本身不占位,也不推进指针,所以多个断言可以堆叠在同一个位置,各自独立校验——这正是它能做“多条件并行检查”的核心机制。











