JavaScript replace() 函数详解与高级用法

一只小鹿
一只小鹿
发布时间:2026-10-13 | 6人浏览过
原创

JavaScript 的 String.prototype.replace() 不仅支持简单的文本替换,结合正则表达式和回调函数还能实现复杂的字符串转换、格式化和数据处理功能。

基础语法与核心概念

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。其基本语法如下:

stringObject.replace(regexp/substr, replacement)

该方法返回一个新的字符串,不会修改原字符串对象。主要涉及两个参数:

  • regexp/substr:必需。规定子字符串或要替换的模式的 RegExp 对象。如果传入的是普通字符串,它将被视为直接量文本模式(即只匹配字面量),而不是先转换为正则对象。
  • replacement:必需。可以是一个字符串(可包含特殊字符序列),也可以是一个函数,该函数的返回值将用来替换匹配到的内容。

正则全局匹配的重要性

这是使用 replace() 时最常见的陷阱。如果不使用全局修饰符 g,replace() 只会替换第一个匹配项。

var str = "aaaaa";
var str1 = str.replace("a", "b"); // 仅替换第一个 'a'
var str2 = str.replace(/a/g, "b"); // 替换所有 'a'

运行结果分别为:

  • str1: "baaaa"
  • str2: "bbbbb"

如果使用字符串作为第一个参数,即使原字符串有多个匹配,也只会发生一次替换:

'I am loser, You are loser'.replace('loser', 'hero');
// 结果: "I am hero, You are loser"

要实现全局替换,必须使用正则并添加 /g:

'I am loser, You are loser'.replace(/loser/g, 'hero');
// 结果: "I am hero, You are hero"

Replacement 中的特殊字符

当 replacement 为字符串时,可以使用以美元符号 $ 开头的字符序列来引用匹配结果的不同部分:

  • $1, $2, ..., $99:对应正则表达式中第 1 到第 99 个括号匹配的子组。
  • $&:整个匹配的文本。
  • $`:匹配文本之前的内容(Left context)。
  • $':匹配文本之后的内容(Right context)。
  • $$:字面量的美元符号。

分组匹配与格式化

利用 $1 等占位符可以轻松重构字符串结构。例如,将连续的数字格式化为带连线的形式:

var str = "1234567890";
str.replace( /(\d{3})(\d{3})(\d{4})/g, "$1-$2-$3" );
// 结果: "123-456-7890"

反向引用与前后文操作

利用 $` 和 $' 可以实现类似“复制左边”或“复制右边”的效果:

'abc'.replace(/b/, "$`"); // 结果: "aac" (用 b 左边的 a 替换 b)
'abc'.replace(/b/, "$'"); // 结果: "acc" (用 b 右边的 c 替换 b)

给特定词加括号也是一个典型应用场景:

var sStr = '讨论一下正则表达式中的 replace 的用法';
sStr.replace(/正则表达式/, '{$&}');
// 结果: "讨论一下{正则表达式}中的 replace 的用法"

使用回调函数进行动态替换

当替换逻辑复杂,需要基于上下文计算新值时,可以将一个函数作为第二个参数传入。replace() 会为每一个匹配调用这个函数。

函数的参数

回调函数接收的参数顺序如下:

  1. 全匹配字符串:整个被替换的部分。
  2. 捕获组 1, 2, ...:如果有括号,则按顺序传入对应的子串。
  3. 偏移量:匹配在原字符串中的索引位置。
  4. 原字符串:发起 replace 调用的原始字符串。

实际应用示例

1. 大小写转换
批量将特定范围的字符转为小写:

'JAVASCRIPT'.replace(/[A-G]/g, function(match) {
 return match.toLowerCase();
});
// 结果: "JaVaScRIPT"

2. 提取 Email 用户名反转
将 'user@domain.com' 替换为 '@domain,user':

'nimojs@126.com'.replace(/(.+)(@)(.*)/, function(fullMatch, user, atSymbol, domain) {
 // arguments[0]: nimojs@126.com
 // arguments[1]: nimojs
 // arguments[2]: @
 // arguments[3]: 126.com
 // arguments[4]: 0 (index)
 // arguments[5]: nimojs@126.com (original string)
 return "@$1,$3"; // 注意这里为了演示使用了新的逻辑组合
});

3. 清理 HTML 内联样式中的引号
移除 CSS 属性值中的单引号:

'<span style="font-family:\''微软雅黑\'';">demo</span>'.replace(/\''[^']+\''/g, function(match) {
 var result = match.replace(/\''/g, ''); // 去除两端的单引号
 console.log(result); // 输出: 微软雅黑
 return result;
});
// 结果: <span style="font-family:微软雅黑;">demo</span>

通过理解这些机制,开发者可以更灵活地操控字符串数据,满足从简单的文本清洗到复杂的数据格式化需求。

以上就是 JavaScript replace() 方法详细用法的更多内容,更多关于 JavaScript 字符串处理的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表