跳到主要内容

replace

2023年08月08日
柏拉文
越努力,越幸运

一、认识


replace() 方法返回一个新字符串,其中一个、多个或所有匹配的 pattern 被替换为 replacement。该方法并不改变调用它的字符串本身,而是返回一个新的字符串。字符串模式只会被替换一次。要执行全局搜索和替换,请使用带有 g 标志的正则表达式或使用 replaceAll()

二、语法


const str = "xxx";
const strNew = str.replace(pattern, replacement)
  • pattern: 可以是字符串或者一个带有 Symbol.replace 方法的对象,典型的例子就是正则表达式。任何没有 Symbol.replace 方法的值都会被强制转换为字符串。

  • replacement: 可以是字符串或函数。

    • 函数: 如果是函数,将为每个匹配调用该函数,并将其返回值用作替换文本。

    • 字符串: 如果是字符串,它将替换由 pattern 匹配的子字符串。支持一些特殊的替换模式

  • strNew: 一个新的字符串,其中一个、多个或所有的匹配项都被指定的替换项替换。

2.1 pattern 为正则表达式

如果 pattern 为正则表达式, 替换字符串可以包括以下特殊替换模式:

  • $$: 插入一个 "$"。

  • $& : 插入匹配的子字符串。

  • `$``: 插入匹配子字符串之前的字符串片段。

  • $': 插入匹配子字符串之后的字符串片段。

  • $n: 插入第 n(索引从 1 开始)个捕获组,其中 n 是小于 100 的正整数。

  • $: 插入名称为 Name 的命名捕获组。

只有当 pattern 参数是一个 RegExp 对象时,$n$<Name> 才可用。如果 pattern 是字符串,或者相应的捕获组在正则表达式中不存在,则该模式将被替换为一个字面量。如果该组存在但未匹配(因为它是一个分支的一部分),则将用空字符串替换它。

2.2 replacement 为函数

你可以将第二个参数指定为函数。在这种情况下,匹配完成后将调用该函数。函数的结果(返回值)将用作替换字符串。注意: 上述 pattern 特殊替换模式不适用于替换器函数返回的字符串。

语法

const str = "xxx";
const strNew = str.replace(pattern, replacer);

function replacer(match,p1,p2,……,pn,offset,string,groups){
return replacement;
}
  • match: 匹配的子字符串。(对应于上面的 $&。)

  • p1,p2,……,pn: 如果 replace() 的第一个参数是 RegExp 对象,则为捕获组(包括命名捕获组)找到的第 n 个字符串。(对应于上面的 $1$2 等。)例如,如果 pattern/(\d+)(\w+)/,则 p1\a+ 的匹配项,p2\b+ 的匹配项。如果该组是分支的一部分(例如 abc.replace(/(a)|(b)/, Replacer)),则不匹配的替代项将为 undefined

  • offset: 原始字符串中匹配子字符串的偏移量。例如,如果整个字符串是 abcd,而匹配的子字符串是 bc,那么这个参数将是 1

  • string: 正在检查的原始字符串

  • groups: 一个捕获组命名组成的对象,值是匹配的部分(如果没有匹配,则为 undefined)。仅在 pattern 包含至少一个命名捕获组时才存在。

参数的确切数量取决于第一个参数是否为 RegExp 对象,以及它有多少个捕获组。

三、场景


3.1 交换单词

const str = 'wen qiang';
const reg = /(\w+)\s+(\w+)/;
const strNew = str.replace(reg, '$2 $1');
console.log(strNew);