← 返回博客
/编程

正则表达式进阶指南

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(...) 移出循环

小结

正则的进阶之路 = 断言 + 分组 + 对引擎特性的敬畏。用得好是利器,用不好是灾难。

加载中…