JavaScript中string replace高级用法详解

 更新时间:2026年02月06日 09:56:39   作者:无风听海  
replace()方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串,这篇文章主要介绍了JavaScript中string replace高级用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

1. 方法定义

str.replace(searchValue, replaceValue)

参数说明:

参数类型含义
searchValuestring 或 RegExp被替换的目标
replaceValuestring 或 function替换值,可以是字符串或回调函数

返回值:

  • 返回一个新字符串
  • 原字符串不改变

2. 基本用法

2.1 字符串替换(非正则)

let s = "hello world";
let r = s.replace("world", "JS");
console.log(r); // "hello JS"

⚠️ 注意:

  • 只替换第一个匹配
  • 字符串模式不支持全局替换
"abcabc".replace("a", "X"); // "Xbcabc"(只替换第一个 a)

2.2 正则替换

单次替换

let s = "abc123";
let r = s.replace(/\d+/, "456");
console.log(r); // "abc456"
  • 默认只替换第一个匹配
  • 使用正则可以匹配复杂模式

全局替换(g)

let s = "a1b2c3";
let r = s.replace(/\d/g, "X");
console.log(r); // "aXbXcX"

3. 字符串替换占位符

replaceValue 是字符串时,可以使用一些占位符:

占位符含义示例
$&整个匹配字符串"abc123".replace(/\d+/, "[$&]")"abc[123]"
$1…$n捕获组"2026-01-15".replace(/(\d{4})-(\d{2})-(\d{2})/, "$2/$3/$1")"01/15/2026"
$` 匹配前的内容"foo123bar".replace(/\d+/, "[$]“)"foo[foo]bar”`
$'匹配后的内容"foo123bar".replace(/\d+/, "[$']")"foo[bar]bar"
$$字面 $"price=100".replace(/\d+/, "$$$&")"price=$100"

⚠️ 工程注意:

  • $&, $``, $'` 可能影响性能
  • 复杂逻辑最好用回调函数

4. 回调函数替换(推荐工程用法)

replaceValue 是函数时,每次匹配都会调用回调:

str.replace(regex, function(match, p1, p2, ..., offset, string, groups) { ... });

参数说明:

参数含义
match当前匹配的字符串($&)
p1, p2 …捕获组(对应 $1, $2 …)
offsetmatch 在原字符串中的起始索引
string原始字符串
groups命名捕获组对象(ES2018+)

示例 1:简单回调替换

let s = "apple 123 banana 456";
let r = s.replace(/\d+/g, (match) => `[${match}]`);
console.log(r); // "apple [123] banana [456]"

示例 2:捕获组 + 条件替换

let s = "2026-01-15";
let r = s.replace(/(\d{4})-(\d{2})-(\d{2})/, (match, year, month, day) => {
  return `${day}-${month}-${year}`;
});
console.log(r); // "15-01-2026"

示例 3:基于匹配位置替换

let s = "foo123bar456";
let r = s.replace(/\d+/g, (match, offset) => {
  return offset < 6 ? `[${match}]` : `{${match}}`;
});
console.log(r); // "foo[123]bar{456}"

5. 正则复杂规则与注意事项

5.1 Alternation (|) 顺序问题

let s = "abc";
console.log(s.replace(/a|abc/, "X")); // "Xbc"
console.log(s.replace(/abc|a/, "X")); // "X"

规则:

  • 从左到右匹配
  • 第一个匹配成功的分支胜出
  • JS 不会自动选择最长匹配

✅ 工程规范:

  • 长模式放前面,短模式放后面

5.2 捕获组

  • 普通括号 () 会生成捕获组
  • (?:) 不捕获
let s = "abc123";
let r = s.replace(/([a-z]+)(\d+)/, "$2-$1");
console.log(r); // "123-abc"

5.3 多次匹配

  • 全局 g 会扫描整个字符串
  • 每次匹配成功后,指针会移动 match.length
  • 零宽匹配(如 (?=x)) 会被强制 +1 防止死循环

5.4 用户输入安全

当用户输入用作正则:

function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

6. 复杂示例:关键词高亮(工程级)

function highlight(text, keywords) {
  // 长词优先
  keywords = [...keywords].sort((a,b)=>b.length - a.length);
  
  const regex = new RegExp(
    keywords.map(k => k.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'),
    'gi'
  );

  return text.replace(regex, match => `<span class="highlight">${match}</span>`);
}

let result = highlight("11:22:22:33:44:55", ["11", "22", "33", "11:22:22"]);
console.log(result);
// <span class="highlight">11:22:22</span>:<span class="highlight">33</span>:44:55

特点:

  • 长词优先 → 避免短词覆盖长词
  • 转义用户输入 → 安全
  • 回调函数 → 可自由控制 HTML 或其他格式

7. 替换结构化数据示例

let str = "key1=123;key2=456";
let pairs = [];
str.replace(/(\w+)=(\d+)/g, (_, key, value) => {
  pairs.push({ key, value });
});
console.log(pairs);
// [{key:"key1",value:"123"}, {key:"key2",value:"456"}]

注意:replace 回调必须返回字符串,这里我们返回 _ 保持原字符串

8. 总结与工程规范建议

  1. 简单替换:

    • 字符串模式可用
    • 正则模式可用
  2. 复杂逻辑:

    • 强烈推荐回调函数
  3. 多关键词或多分支:

    • 长词优先
    • 使用 escapeRegExp 转义
  4. 占位符:

    • $1…$n 推荐
    • $& / $`` / $' 仅用于简单调试
  5. 解析 / 结构化数据:

    • 回调收集数据,replace 仅返回字符串
  6. 性能注意:

    • 零宽断言慎用
    • 大文本用回调 + 长词优先策略

到此这篇关于JavaScript中string replace高级用法详解的文章就介绍到这了,更多相关JS string replace高级用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JS实现动态星空背景效果

    JS实现动态星空背景效果

    这篇文章主要为大家详细介绍了JS实现动态星空背景效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 全面接触神奇的Bootstrap导航条实战篇

    全面接触神奇的Bootstrap导航条实战篇

    导航条(navbar)在Bootstrap中是一个独立组件,导航条(navbar)和导航(nav)在Bootstrap中是有明显区别的,本文全面接触神奇的Bootstrap导航条,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 微信小程序入门之指南针

    微信小程序入门之指南针

    这篇文章主要为大家详细介绍了微信小程序入门之指南针,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • ES6新特性之解构、参数、模块和记号用法示例

    ES6新特性之解构、参数、模块和记号用法示例

    这篇文章主要介绍了ES6新特性之解构、参数、模块和记号用法,结合实例形式分析了解构、参数、模块和记号的功能、用法及相关使用注意事项,需要的朋友可以参考下
    2017-04-04
  • layui导出Excel表格的方法代码举例

    layui导出Excel表格的方法代码举例

    使用了layui自带的导出功能后,真的是超级便捷,下面这篇文章主要给大家介绍了关于layui导出Excel表格的方法代码,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • javascript使用isNaN()函数判断变量是否为数字

    javascript使用isNaN()函数判断变量是否为数字

    javascript中判断变量是否为数字的方法,这里主要介绍javascript里的 isNaN() 函数,具体使用如下,感兴趣的朋友可以参考下
    2013-09-09
  • js实现网页的两个input标签内的数值加减(示例代码)

    js实现网页的两个input标签内的数值加减(示例代码)

    下面小编就为大家带来一篇js实现网页的两个input标签内的数值加减(示例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • js的新生代垃圾回收知识点总结

    js的新生代垃圾回收知识点总结

    在本篇文章里小编给大家整理的是关于js的新生代垃圾回收的相关知识点内容,有需要的朋友们可以参考学习下。
    2019-08-08
  • 微信小程序上线发布具体流程简析

    微信小程序上线发布具体流程简析

    众所周知,微信小程序制作成功后,是需要提交到微信公众平台去审核的,审核通过后,才可以发布上线的,上线了之后才可以进行运营的,下面这篇文章主要给大家介绍了关于微信小程序上线发布具体流程的相关资料,需要的朋友可以参考下
    2022-10-10
  • JS实现的排列组合算法示例

    JS实现的排列组合算法示例

    这篇文章主要介绍了JS实现的排列组合算法,结合完整实例形式详细分析了排列组合算法的原理与javascript相关实现技巧,需要的朋友可以参考下
    2019-07-07

最新评论