JavaScript的replace()方法默认只替换第一个匹配项,需结合正则表达式与g标志实现全局替换,并支持i、m等标志、捕获组引用、函数动态处理及类型安全操作。
javascript 的 replace() 方法默认只替换第一个匹配项,真正的能力来自正则表达式与动态逻辑的结合。掌握几个关键点,就能应对绝大多数字符串处理场景。
必须用正则 + g 标志才能全局替换
字符串字面量模式(如 "a".replace("a", "x"))永远只换一次。要批量替换,必须用正则并带上 g(global)标志:
-
"a a a".replace(/a/g, "x")→"x x x" - 忽略大小写?加
i:"HELLO hello".replace(/hello/gi, "hi")→"hi hi" - 只换行首?用锚点:
"Line1\nLine2".replace(/^L/gm, "X")→"Xine1\nXine2"(m启用多行模式) - 特殊字符如
.、$、(等需转义:"price.$9.99".replace(/\$\d+\.\d+/g, "[PRICE]")
用 $1、$& 等占位符复用匹配内容
正则中用括号 () 捕获的内容,可在替换字符串中直接引用,无需额外提取:
-
$1、$2… 对应第 1、2 个捕获组:"2026-07-09".replace(/(\d{4})-(\d{2})-(\d{2})/, "$2/$3/$1")→"07/09/2026" -
$&是整个匹配:"id:123".replace(/\d+/, "[$&]")→"id:[123]" -
$`是匹配前部分,$'是匹配后部分,适合上下文感知操作 - 想字面输出
$?写成$$
传函数实现动态替换逻辑
当替换结果依赖匹配内容本身(比如计算、格式化、条件判断),函数参数最灵活:
- 函数接收固定参数:匹配字符串、各捕获组、匹配位置、原字符串
- 首字母大写:
"hello world".replace(/\b\w/g, c => c.toUpperCase())→"Hello World" - 价格加税:
"$19.99 and $5.00".replace(/\$(\d+\.\d+)/g, (m, num) => `$${(Number(num) * 1.1).toFixed(2)}`) - 函数内可做任意逻辑,包括调用外部 API(需配合 Promise 处理异步)
注意不可变性与类型安全
replace() 从不修改原字符串,也不接受非字符串输入:
立即学习“Java免费学习笔记(深入)”;
- 务必接收返回值:
let newStr = oldStr.replace(...),否则替换无效 - 数字、布尔等需先转字符串:
String(123).replace("2", "X") -
null或undefined会报错,稳妥写法是String(val).replace(...) - 若只需纯字面全局替换,ES2021 的
replaceAll()更直观(但它不支持正则)


















