极客时间返利平台,你可以在上边通过山月的链接购买课程,并添加我的微信 (shanyue94) 领取返现。
山月训练营之面试直通车 服务上线了,从准备简历、八股文准备、项目经历准备、面试、面经、面经解答、主观问题答复、谈薪再到入职的一条龙服务。

# js 如何全部替代一个子串为另一个子串

更多描述

假设有一个字符串 hello. hello. hello. 需要替换为 AAA,即把 hello. 替换为 A

Issue

欢迎在 Gtihub Issue 中回答此问题: Issue 361 (opens new window)

如果需要全量替换字符串,可以使用 String.prototype.replace(re, replacer),其中正则表达式需要开启 global flag

const s = "foo foo foo";
s.replce(/foo/g, "bar");

那如题中,是否可以使用正则表达式来替代子串

答:不可以,因为使用子串构建正则时,有可能有特殊字符,就有可能出现问题,如下

// 期待结果: 'AhelloX hello3 '
> 'hello. helloX hello3 '.replace(new RegExp('hello. ', 'g'), 'A')
< "AAA"

而在 javascript 中替换子串只能使用一种巧妙的办法:str.split('foo').join('bar')

> 'hello. hello. hello. '.split('hello. ').join('A')
< "AAA"

真是一个巧(笨)妙(拙)的办法啊!!!!!大概 TC39 也意识到了一个问题,于是出了一个新的 API,在 ESNext

String.prototype.replaceAll();

"aabbcc".replaceAll("b", ".");
// 'aa..cc'

详细文档在 String.prototype.replaceAll (opens new window)

# 总结(及直接答案)

两种办法

  • str.split('foo').join('bar')
  • str.replaceAll('foo', 'bar'),在 ESNext 中,目前支持性不好

正则表达式中有特殊字符的话,可以将其转译:

>  'hello. helloX hello3 '.replace(new RegExp('hello\\. ', 'g'), 'A')
< "AhelloX hello3 "

正则表达式中有特殊字符的话,可以将其转译:

>  'hello. helloX hello3 '.replace(new RegExp('hello\\. ', 'g'), 'A')
< "AhelloX hello3 "

如果需要正则转义的话,得提前实现一个 escapeReg 函数来进行转义,工作量有些大易出错,我试着实现一下

const escapeReg = (str) =>
  str.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
Last Updated: 11/27/2021, 6:11:48 PM