javascript的replace()方法默认只替换第一个匹配项;需配合正则表达式加g标志实现全局替换,支持i标志忽略大小写、捕获组引用(如$1)、锚点控制位置、特殊字符转义及函数动态处理,且始终返回新字符串而不修改原串。

JavaScript 的 replace() 方法远不止“找一个换一个”,它的真正威力来自正则表达式配合动态替换逻辑。掌握几个关键技巧,就能把字符串处理从机械操作升级为精准控制。
必须加 g 标志才能全局替换
很多人误以为 "a a a".replace("a", "x") 会变成 "x x x",实际结果是 "x a a"——它只动第一个匹配项。字符串字面量模式天然不支持全局替换。
- 要用正则:写成
/a/g,g表示 global,缺了就只换一次 - 大小写不敏感?加上
i:/HELLO/gi - 想只换开头的?用锚点:
/^start/g,搭配m可用于多行文本的每行开头 - 特殊字符要转义:比如替换点号
.,得写\.,否则会被当作通配符
用 $1、$& 等占位符复用匹配内容
正则里用括号 () 捕获的内容,能在替换字符串中直接引用,无需额外提取。
-
$1、$2… 对应第 1、2 个捕获组:"2026-05-20".replace(/(\d{4})-(\d{2})-(\d{2})/, "$2/$3/$1")→"05/20/2026" -
$&是整个匹配到的字符串:"price: 99".replace(/\d+/, "[$&]")→"price: [99]" -
$`是匹配前的部分,$'是匹配后部分,适合做上下文感知替换 - 想字面输出
$?写两个:$$
传函数实现动态替换逻辑
当替换规则依赖匹配内容本身(比如转大写、加前缀、调用计算),字符串参数就不够用了,这时第二个参数传函数最灵活。
- 函数接收参数顺序固定:匹配字符串、捕获组1、捕获组2…、匹配位置、原字符串
- 例如首字母大写:
"hello world".replace(/\b\w/g, c => c.toUpperCase()) - 又如价格加税:
"$19.99 and $5.00".replace(/\$(\d+\.\d+)/g, (m, num) => `$${(Number(num) * 1.1).toFixed(2)}`) - 函数内可做判断、格式化、甚至异步请求(需结合 Promise 处理)
注意不可变性与类型安全
replace() 从不修改原字符串,它总是返回新字符串;同时它只对字符串生效,其他类型会隐式转换,也可能出错。
- 别忘了接返回值:
let newStr = oldStr.replace(...),否则替换就“消失”了 - 数字、布尔等类型要先转字符串:
String(123).replace("2", "X"),不能直接123.replace() -
null或undefined会报错,稳妥做法是String(val).replace(...) - 若只需简单全局字面替换,ES2021 的
replaceAll()更直观,但它不支持正则
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











