JavaScript正则需协同RegExp实例、字符串方法及标志位;字面量与new RegExp()转义规则不同,后者需双反斜杠;test()返回布尔值,exec()返回匹配数组并更新lastIndex,match()有g时丢弃捕获组。

JavaScript 中正则表达式不是“用完即弃”的工具,而是要结合 RegExp 实例、字符串方法和标志位协同工作;直接写字面量或用 new RegExp() 会影响转义逻辑和动态性,这点最容易出错。
正则字面量 vs new RegExp():转义规则完全不同
字面量写法如 /\d+/g,反斜杠在字符串中不需双写;但用 new RegExp() 构造时,字符串参数里的反斜杠是 JS 字符串解析阶段就处理的,所以 \d 必须写成 "\\d",否则会变成非法转义。
- ✅ 正确(字面量):
const re = /\d{3}-\d{4}/; - ❌ 错误(构造函数):
new RegExp("\d{3}-\d{4}")→\d被当普通字符,不匹配数字 - ✅ 正确(构造函数):
new RegExp("\\d{3}-\\d{4}")或new RegExp(/\d{3}-\d{4}/)
test()、exec()、match() 的行为差异
这三个是最常用的方法,但返回值和副作用完全不同:前者是布尔判断,中间者带状态(影响 lastIndex),后者依赖全局标志 g 决定是否返回全部匹配。
-
re.test(str):只返回true/false,不修改re.lastIndex(除非手动设) -
re.exec(str):返回匹配数组或null,且每次调用后自动更新re.lastIndex(仅对带g或y的正则) -
str.match(re):无g时返回类似exec的数组(含index、input);有g时只返回纯匹配字符串数组,丢弃捕获组信息
全局匹配 + 捕获组:为什么 match() 有时拿不到分组?
加了 g 标志的 match() 会放弃所有捕获组内容,只保留完整匹配项。想拿到每组数据,必须用 exec() 循环,或改用 matchAll()(ES2020+)。
立即学习“Java免费学习笔记(深入)”;
- ❌
"a1b2".match(/([a-z])(\d)/g)→["a1", "b2"](没分组) - ✅
"a1b2".match(/([a-z])(\d)/)→["a1", "a", "1", index: 0, input: "a1b2"] - ✅
Array.from("a1b2".matchAll(/([a-z])(\d)/g))→ 返回迭代器,每个元素是完整exec结果
真正麻烦的是跨行匹配和 Unicode 字符——. 默认不匹配换行符,\w 在非 u 模式下可能漏掉 emoji 或中文;这些细节不会报错,但会让模式在某些输入下静默失效。











