百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

在 JavaScript 中替换所有指定字符 3 种方法

liuian 2025-03-14 18:47 20 浏览

在 JS 没有提供一种简便的方法来替换所有指定字符。 在 Java 中有一个 replaceAll() ,replaceAll(String regex, String replacement))方法使用给定的参数 replacement 替换字符串所有匹配给定的正则表达式的子字符串。

在 JS 最新的提案
String.prototype.replaceAll() 中,它将replaceAll()方法用于字符串。

在该提案还没出来之前,我们来看看在 JS 中有哪些方法可以实现 reaplceAll 的效果。

第一种:使用 split 和 join 的方法

这种方法,主要包含二个阶段:

  1. 使用 split 方法,根据指定的字符将字符串分成多个部分。
  2. 然后使用 join 方法将分割的多个部分连接在一直,并在它们之间插入指定的字符。

例如,我们将字符串'1+2+3'中的+替换为-。首先,通过split方法根据 +分割符将'1+2+3'分开,得到['1','2','3']。然后通过 join 方法并指定连接字条-,得到结果'1-2-3'。示例如下:

const search = 'duck';
const replaceWith = 'goose';

const result = 'duck duck go'.split(search).join(replaceWith);

result; // => 'goose goose go'

'duck duck go'.split('duck')将字符串分割成几段:['', ' ', ' go']。['', ' ', ' go'].join('goose') 在元素之间插入'goose'并连接起来,得到'goose goose go'。

最后我们把这种方式封装成一个帮助函数 replaceAll:

function replaceAll(string, search, replace) {
  return string.split(search).join(replace);
}

replaceAll('abba', 'a', 'i');          // => 'ibbi'
replaceAll('go go go!', 'go', 'move'); // => 'move move move!'
replaceAll('oops', 'z', 'y');          // => 'oops'

这种方法需要将字符串转换为数组,然后再转换回字符串。这是一种变通方法,但不是一个好的解决方案。

2. 使用全局正则表达式replace()

String.prototype。replace(regExp, replaceWith)搜索正则表达式regExp出现的情况,然后使用replaceWith字符串替换所有匹配项。

必须启用正则表达式上的全局标志,才能使replace()方法替换模式出现的所有内容,我们可以这样做:

  1. 在正则表达式文字中,将g附加到标志部分:/search/g。
  2. 对于正则表达式构造函数,使用 flags 参数:new RegExp('search', 'g')

我们把所有的duck换成goose:

const searchRegExp = /duck/g
const replaceWith = 'goose'

const result = 'duck duck go'.replace(searchRegExp, replaceWith)

result // 'goose goose go'

正则表达式文字/duck/g与'duck'字符串匹配,并且启用了全局模式。

'duck duck go'.replace(/duck/g, 'goose')用'goose'替换所有匹配/duck/g字符串。

通过向正则表达式添加i标志,可以忽略大小写:

const searchRegExp = /duck/gi;
const replaceWith = 'goose';

const result = 'DUCK duck go'.replace(searchRegExp, replaceWith);

result; // => 'goose goose go'

再次查看正则表达式:/duck/gi。 正则表达式启用了不区分大小写的搜索:i和全局标志g。 /duck/gi匹配'duck',以及'DUCK','Duck'等。

'DUCK duck go'.replace(/duck/gi, 'goose')以不区分大小写的方式用'goose'替换了/duck/gi`所匹配到的结果。

虽然正则表达式替换了所有出现的字符串,但在我看来,这种方法过于繁琐。


2.1 字符串中的正则表达式

当在运行时确定搜索字符串时,使用正则表达式方法不方便。 从字符串创建正则表达式时,必须转义字符-[] / {}()* +? 。 \ ^ $ |,示例如下:

const search = '+'

const searchRegExp = new RegExp(search, 'g') // // 抛出 SyntaxError 异常
const replaceWith = '-'

const result = '5+2+1',replace(searchRegExp, replaceWith )

上面的代码片段尝试将搜索字符串'+'转换为正则表达式。 但是'+'是无效的正则表达式,因此会引发SyntaxError: Invalid regular expression: /+/异常。


2.2 字符串的 replace() 方法

如果replace(search, replaceWith)的第一个参数是字符串,那么该方法只替换search的第一个结果。

const search = 'duck';
const replaceWith = 'goose';

const result = 'duck duck go'.replace(search, replaceWith);

result; // => 'goose duck go'

'duck duck go'.replace('duck','goose')仅将'duck'的首次出现替换为'goose'。


3.replaceAll() 方法

最后,新的提案
String.prototype.replaceAll()(在第3阶段)将replaceAll()方法引入到 JavaScript 的字符串中。

replaceAll(search, replaceWith)字符串方法用replaceWith替换所有的search字符串,没有任何变通方法。

我们把所有的duck换成goose:

const search = 'duck'
const replaceWith = 'goose';

const result = 'duck duck go'.replaceAll(search, replaceWith);

result; // => 'goose goose go'

'duck duck go'.replaceAll('duck', 'goose')将所有出现的'duck'字符串替换为'goose',这是简单明了的解决方案。


3.1 replaceAll()与replace()的区别

字符串方法replaceAll(search, replaceWith)和replace(search, replaceWith)的行为方式是一样的,除了两件事:

  1. 如果search参数是一个字符串,那么replaceAll()用replaceWith替换所有出现的search,而replace()只替换第一次出现的search。

2.如果search参数是一个非全局正则表达式,那么replaceAll()将抛出一个TypeError 异常。


4. 总结

替换所有出现的字符串应该很容易。 但是,JavaScript 很久一段时间没有提供这种方法。

一种方法是通过搜索字符串将字符串拆分为多个块,将字符串重新连接,然后在块之间放置替换字符串:string.split(search).join(replaceWith)。 这种方法有效,但是很麻烦。

另一种方法是将String.prototype.replace()与启用了全局搜索的正则表达式一起使用:string.replace(/SEARCH/g, replaceWith)。

不幸的是,由于必须转义正则表达式的特殊字符,因此在运行时无法轻松地从字符串生成正则表达式。 处理正则表达式以简单地替换字符串的方法非常麻烦。

最后,
String.prototype.replaceAll()方法可以轻松地直接替换所有出现的字符串:string.replaceAll(search, replaceWith)。 这是第3阶段的提案,但希望很快就会纳入新的JavaScript标准。

我的建议是使用replaceAll()来替换字符串。但你需要一个polyfill来使用这个方法。

你还知道其他替换所有字符串出现的方法吗?欢迎留言讨论。


作者: Dmitri Pavlutin 译者:前端小智 来源:dmitripavlutin

原文:
https://dmitripavlutin.com/replace-all-string-occurrences-javascript/

相关推荐

2023年最新微信小程序抓包教程(微信小程序 抓包)

声明:本公众号大部分文章来自作者日常学习笔记,部分文章经作者授权及其他公众号白名单转载。未经授权严禁转载。如需转载,请联系开百。请不要利用文章中的相关技术从事非法测试。由此产生的任何不良后果与文...

测试人员必看的软件测试面试文档(软件测试面试怎么说)

前言又到了毕业季,我们将会迎来许多需要面试的小伙伴,在这里呢笔者给从事软件测试的小伙伴准备了一份顶级的面试文档。1、什么是bug?bug由哪些字段(要素)组成?1)将在电脑系统或程序中,隐藏着的...

复活,视频号一键下载,有手就会,长期更新(2023-12-21)

视频号下载的话题,也算是流量密码了。但也是比较麻烦的问题,频频失效不说,使用方法也难以入手。今天,奶酪就来讲讲视频号下载的新方案,更关键的是,它们有手就会有用,最后一个方法万能。实测2023-12-...

新款HTTP代理抓包工具Proxyman(界面美观、功能强大)

不论是普通的前后端开发人员,还是做爬虫、逆向的爬虫工程师和安全逆向工程,必不可少会使用的一种工具就是HTTP抓包工具。说到抓包工具,脱口而出的肯定是浏览器F12开发者调试界面、Charles(青花瓷)...

使用Charles工具对手机进行HTTPS抓包

本次用到的工具:Charles、雷电模拟器。比较常用的抓包工具有fiddler和Charles,今天讲Charles如何对手机端的HTTS包进行抓包。fiddler抓包工具不做讲解,网上有很多fidd...

苹果手机下载 TikTok 旧版本安装包教程

目前苹果手机能在国内免拔卡使用的TikTok版本只有21.1.0版本,而AppStore是高于21.1.0版本,本次教程就是解决如何下载TikTok旧版本安装包。前期准备准备美区...

【0基础学爬虫】爬虫基础之抓包工具的使用

大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬...

防止应用调试分析IP被扫描加固实战教程

防止应用调试分析IP被扫描加固实战教程一、概述在当今数字化时代,应用程序的安全性已成为开发者关注的焦点。特别是在应用调试过程中,保护应用的网络安全显得尤为重要。为了防止应用调试过程中IP被扫描和潜在的...

一文了解 Telerik Test Studio 测试神器

1.简介TelerikTestStudio(以下称TestStudio)是一个易于使用的自动化测试工具,可用于Web、WPF应用的界面功能测试,也可以用于API测试,以及负载和性能测试。Te...

HLS实战之Wireshark抓包分析(wireshark抓包总结)

0.引言Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接...

信息安全之HTTPS协议详解(加密方式、证书原理、中间人攻击 )

HTTPS协议详解(加密方式、证书原理、中间人攻击)HTTPS协议的加密方式有哪些?HTTPS证书的原理是什么?如何防止中间人攻击?一:HTTPS基本介绍:1.HTTPS是什么:HTTPS也是一个...

Fiddler 怎么抓取手机APP:抖音、小程序、小红书数据接口

使用Fiddler抓取移动应用程序(APP)的数据接口需要进行以下步骤:首先,确保手机与计算机连接在同一网络下。在计算机上安装Fiddler工具,并打开它。将手机的代理设置为Fiddler代理。具体方...

python爬虫教程:教你通过 Fiddler 进行手机抓包

今天要说说怎么在我们的手机抓包有时候我们想对请求的数据或者响应的数据进行篡改怎么做呢?我们经常在用的手机手机里面的数据怎么对它抓包呢?那么...接下来就是学习python的正确姿势我们要用到一款强...

Fiddler入门教程全家桶,建议收藏

学习Fiddler工具之前,我们先了解一下Fiddler工具的特点,Fiddler能做什么?如何使用Fidder捕获数据包、修改请求、模拟客户端向服务端发送请求、实施越权的安全性测试等相关知识。本章节...

fiddler如何抓取https请求实现手机抓包(100%成功解决)

一、HTTP协议和HTTPS协议。(1)HTTPS协议=HTTP协议+SSL协议,默认端口:443(2)HTTP协议(HyperTextTransferProtocol):超文本传输协议。默认...