口碑好的EMBA我问了6位在读校友,择校留意要点点都在这
2026/8/2 9:14:06
断言(Assertions)是正则表达式中一类零宽度的匹配机制,它们只检查当前位置是否满足特定条件,不消耗任何字符,也不参与捕获。断言分为环视(Lookaround)和条件断言两大类,是实现复杂逻辑匹配的核心工具。
环视用于检查当前匹配位置的前方或后方是否符合某个模式,常用于“前后条件限制”而不把条件部分包含在最终匹配结果中。
| 语法 | 名称 | 描述 | 示例 | 匹配说明 |
|---|---|---|---|---|
(?=pattern) | 正向前瞻(Positive Lookahead) | 当前位置后面必须紧跟 pattern | /\w+(?=px)/ | 匹配 “150px” 中的 “150”(后面必须是 px) |
(?!pattern) | 负向前瞻(Negative Lookahead) | 当前位置后面不能匹配 pattern | /\w+(?!px)/ | 匹配 “150em” 中的 “150”(后面不是 px) |
(?<=pattern) | 正向后瞻(Positive Lookbehind) | 当前位置前面必须紧跟 pattern | /(?<=\$)\d+/ | 匹配 “$100” 中的 “100”(前面必须是 $) |
(?<!pattern) | 负向后瞻(Negative Lookbehind) | 当前位置前面不能匹配 pattern | /(?<!\$)\d+/ | 匹配 “100” 中的 “100”(前面不是 $) |
| 场景 | 正则表达式 | 说明 |
|---|---|---|
| 匹配单位为 px 的数字(不包含单位) | /\d+(?=px)/g | “width: 200px; height: 100em;” → 匹配 “200” |
| 匹配不以 http 开头的 URL | /(?<!http:)\/\/\S+/ | 匹配 “//example.com” 但不匹配 “http://example.com” 中的 // |
| 密码复杂度:必须包含数字但不以数字开头 | /^(?!\d)[A-Za-z0-9]{8,}$/(?=\D*\d)/ | 更复杂组合 |
| 替换千位分隔符(不改变原数字) | /(?<=\d)(?=(\d{3})+(?!\d))/g | “1234567890” → 在匹配位置插入 “,” → “1,234,567,890” |
| 匹配成对引号内的内容(不包含引号) | /(?<=[“"]).*?(?=[”"])/ | 注意实际需处理转义,更复杂 |
部分正则引擎(如 PCRE、Perl、.NET、Python 的regex模块)支持条件判断:根据某个捕获组是否匹配成功来选择不同分支。
| 语法 | 描述 | 示例 |
|---|---|---|
| `(?(n)yes-pattern | no-pattern)` | 如果第 n 个捕获组已匹配成功,则用 yes-pattern,否则用 no-pattern |
| `(?()yes | no)` | 基于命名组 |
注意:JavaScript 原生不支持条件断言,需用其他方式模拟。
re模块不支持可变长度后瞻。regex模块。示例(JavaScript 不支持):
/(?<=.*\d).{3}/ // 可变长度后瞻,检查前面某处有数字| 场景 | 正则表达式 | 用途 |
|---|---|---|
| 匹配重复但不相同的单词 | /\b(\w+)\b(?<!\1\s)\1\b/(需引擎支持) | 更常用分组+反向引用 |
| 验证密码强度(至少一种字符类型) | /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d]{8,}$/ | 多个正向前瞻组合 |
| 提取 URL 中的域名(不包含协议和路径) | /(?<=https?:\/\/)[^\/\?]+/ | 使用正向后瞻 |
| 匹配十六进制颜色值(支持 #FFF 和 #FFFFFF) | `/^#(?:[A-Fa-f0-9]{6} | [A-Fa-f0-9]{3})$/`(不需断言) 或用断言扩展 |
| 去除 HTML 标签但保留内容 | /(?<=<[^>]*>)(.*?)(?=<[^>]*>)/(简化,实际更复杂) | 需小心 XSS |
| 功能 | JavaScript | Python (re) | Python (regex) | .NET | Java | PCRE |
|---|---|---|---|---|---|---|
| 正向前瞻 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
| 负向前瞻 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
| 正向后瞻 | 支持(固定长度) | 支持(固定长度) | 支持(可变) | 支持(可变) | 支持(可变) | 支持(可变) |
| 负向后瞻 | 支持(固定长度) | 支持(固定长度) | 支持(可变) | 支持(可变) | 支持(可变) | 支持(可变) |
| 条件断言 | 不支持 | 不支持 | 支持 | 支持 | 支持 | 支持 |
\b、^、$或分组替代简单断言。断言是正则表达式中最“智能”的部分,掌握它后,你可以实现几乎任意复杂的条件匹配,而不污染匹配结果。它们在数据清洗、表单验证、日志解析等领域尤其强大!
如果你有特定语言环境或想解决的具体匹配问题(如密码规则、金额提取等),可以告诉我,我帮你写出最合适的断言表达式。