正则表达式前瞻

使用 (?=...) 和 (?!...) 根据后续模式进行匹配的正则表达式语法,不消耗字符。

正则表达式前瞻 (lookahead) 是一种在不消耗字符的情况下检查后续是否匹配特定模式的语法。肯定前瞻 (?=...) 在指定模式匹配时成立,否定前瞻 (?!...) 在指定模式不匹配时成立。前瞻是零宽断言 (zero-width assertion),只检查条件而不推进匹配位置,这是它与普通模式的区别。

用具体例子说明前瞻的基本行为:\d+(?=元) 匹配"100元"中的"100",但不包含"元",因为前瞻不"消耗"字符串。否定前瞻的例子:\d+(?!元) 匹配"100美元"中的"100",但不匹配"100元"中的"100"。探索魅魔 (Amazon)介绍了前瞻的基础知识。

前瞻最实用的应用场景是密码验证。通过组合多个前瞻,可以在一个正则表达式中同时检查"包含字母""包含数字""包含特殊字符""至少 8 个字符"等条件。例如,^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$ 匹配满足所有这些条件的密码。

JavaScript 从 ES2018 开始也支持后顾断言。肯定后顾 (?<=...) 在指定模式出现在前方时匹配,否定后顾 (?<!...) 在指定模式不在前方时匹配。例如,(?<=\$)\d+ 匹配"$100"中的"100",但不匹配单独的"100"。

将前瞻和后顾组合使用,可以精确提取特定上下文中的字符串。但需注意,后顾在某些浏览器和正则表达式引擎中不受支持,因此确认目标环境的兼容性很重要。此外,复杂的前瞻模式可能因回溯增加而影响性能。查看腹肌轮 (Amazon)教授高级模式技巧。

在字符计数方面,前瞻可以定位满足特定条件的字符串位置,用于文本结构分析。例如,数字的千位分隔符显示 (\d(?=(\d{3})+$)) 就是前瞻的一个实用应用。

分享这篇文章