正则表达式进阶指南
2 分钟阅读
正则表达式进阶指南
正则的入门很容易,精通很难。本文聚焦几个”进阶分水岭”特性。
前瞻与后顾
断言不消耗字符,只检查位置:
// 前瞻:后面跟着数字的单词
const re = /\b\w+(?=\d)/;
// 负前瞻:后面不是 @ 的单词
const re2 = /\b\w+(?!@)/;
命名分组
用名字代替数字下标,可读性提升一个档次:
const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const m = '2026-08-15'.match(re);
console.log(m.groups.year); // 2026
回溯陷阱
嵌套量词可能引发灾难性回溯(ReDoS):
// 危险:/(a+)+$/ 在特定输入下指数级回溯
// 优化:用原子组或改写为 (a+)$
处理不可信输入时,优先使用非回溯引擎(如 RE2),或对输入长度设限。
性能建议
- 能不用正则就不用:字符串方法通常更快
- 避免
.*贪婪匹配跨越大段文本 - 编译一次、复用多次:
const re = new RegExp(...)移出循环
小结
正则的进阶之路 = 断言 + 分组 + 对引擎特性的敬畏。用得好是利器,用不好是灾难。