JavaScript正则表达式是内建核心能力,字面量简洁但无法动态拼接,变量模式须用new RegExp()并双重转义;带g标志的正则有lastIndex状态,易致exec()失败;replace中优先用函数替代字符串以安全处理捕获组。

JavaScript 正则表达式不是“一种额外功能”,而是内建在字符串方法和 RegExp 构造函数里的核心文本处理能力——它能直接参与 match、replace、test 等操作,不需要引入任何库。
正则字面量 vs new RegExp():什么时候必须用构造函数?
字面量写法 /\d+/g 简洁,但无法动态拼接;一旦模式依赖变量(比如用户输入的搜索词),就必须用 new RegExp(pattern, flags)。
- 字面量中反斜杠只需写一次:
/\\d+/表示匹配一个反斜杠加数字 -
new RegExp()中字符串需双重转义:new RegExp('\\\\d+', 'g')才等价于/\\d+/g - 用户输入含特殊字符(如
$、.、[)时,不转义会破坏正则逻辑——得先用escapeRegExp()类函数处理
常见匹配失败原因:g 标志和 lastIndex 的隐式状态
带 g 标志的正则对象是“有状态”的:多次调用 exec() 会从上次匹配结束位置继续,lastIndex 自动推进。这容易导致第二次 exec() 返回 null,尤其在循环中反复复用同一正则实例时。
- 避免复用:每次匹配都新建正则,或手动重置
regex.lastIndex = 0 -
match()对全局正则返回字符串数组,不改变lastIndex;但exec()和test()会 - 非全局正则(无
g)每次调用都从开头匹配,lastIndex始终为 0
replace() 中的 $1、$2 是什么?如何安全引用捕获组?
replace() 的第二个参数若为字符串,、 等表示对应捕获组内容;但若替换内容来自不可信输入,可能被误解析为特殊变量(比如用户输入含 字符串)。
立即学习“Java免费学习笔记(深入)”;
- 更安全的做法是传入函数:
str.replace(/(\w+):(\d+)/, (match, key, value) => `${key.toUpperCase()}:${value}`) - 函数参数顺序固定:完整匹配、捕获组1、捕获组2……最后是匹配索引和原字符串
- 字符串替换中
$$表示字面量$,$&表示整个匹配,$`和$'分别是匹配前/后的内容
真正难的不是写出一个能跑的正则,而是预判边界情况:中文标点是否要包含?换行符是否允许跨行匹配?空格要不要严格区分全角半角?这些细节往往在测试阶段才暴露,且很难靠肉眼检查出来。











