JavaScript正则难点在于RegExp创建方式、标志位行为及方法返回值结构:/pattern/g与new RegExp('pattern','g')因转义差异导致行为不一致;g标志影响exec()的lastIndex;match()无匹配时返回null而非空数组;需捕获组+全局时用exec()循环或matchAll();replace()中$符号仅在正则参数下生效。

JavaScript 中的正则表达式不是“学完就能用”,而是“用错一次就卡半天”——关键在 RegExp 实例的创建方式、标志位行为、以及方法返回值结构这三点。
为什么 /pattern/g 和 new RegExp('pattern', 'g') 行为有时不一致?
主要差异在转义和动态构建场景:/\d+/g 里反斜杠直接生效;而 new RegExp('\\d+', 'g') 中字符串需双写反斜杠,否则 '\d+' 会被 JS 解析成字面量 d+(因为 \d 不是合法转义,被静默忽略)。
- 动态拼接时必须用
new RegExp,但记得对特殊字符手动转义(比如用户输入的$、.、[等) -
/.../字面量无法插入变量,想插就得走new RegExp(`...${var}...`, 'g') - 全局标志
g影响exec()的 lastIndex,多次调用会“记住位置”,重用前要手动重置regex.lastIndex = 0
String.prototype.match() 返回 null 还是数组?
没匹配到永远返回 null,不是空数组。带 g 标志时只返回匹配内容数组(无捕获组信息);不带 g 时返回含 index、input 和捕获组的数组(即使没分组,第 0 项也是完整匹配)。
- 别直接对
match()结果调用.length或[0],先判null - 需要捕获组又想全局匹配?改用
regexp.exec(str)循环,它每次返回单次匹配详情 - ES2020+ 可用
matchAll(),返回迭代器,天然支持捕获组 + 全局,但注意旧环境不兼容
替换字符串时,$1、$& 这些符号怎么用才不出错?
它们只在 String.prototype.replace() 的 replacement 参数中生效,且仅当第一个参数是正则(不是字符串)时解析。常见误用:把 str.replace(/a/, '') 当成捕获,其实没括号, 就是字面量 。
立即学习“Java免费学习笔记(深入)”;
-
$&是整个匹配,$1是第一个捕获组,$`是匹配前内容,$'是匹配后内容 - 函数作为 replacement 时,参数顺序固定:
(match, p1, p2, ..., offset, string),比$符号更可控 - 如果 replacement 来自用户输入,务必避免直接拼接
$符号,优先用函数形式
真正难的不是写对一个正则,而是搞清它在哪个方法里跑、标志位是否开启、返回值结构怎么解构——尤其是 lastIndex 和 null 判定,漏掉这两点,90% 的“正则失效”问题就解决了。











