在 JavaScript 中替换所有指定字符 3 种方法
在 JS 没有提供一种简便的方法来替换所有指定字符。 在 Java 中有一个 replaceAll() ,replaceAll(String regex, String replacement))方法使用给定的参数 replacement 替换字符串所有匹配给定的正则表达式的子字符串。
在 JS 最新的提案 String.prototype.replaceAll() 中,它将replaceAll()方法用于字符串。
在该提案还没出来之前,我们来看看在 JS 中有哪些方法可以实现 reaplceAll 的效果。
这种方法,主要包含二个阶段:
- 使用 split 方法,根据指定的字符将字符串分成多个部分。
- 然后使用 join 方法将分割的多个部分连接在一直,并在它们之间插入指定的字符。
例如,我们将字符串\’1+2+3\’中的+替换为-。首先,通过split方法根据 +分割符将\’1+2+3\’分开,得到[\’1\’,\’2\’,\’3\’]。然后通过 join 方法并指定连接字条-,得到结果\’1-2-3\’。示例如下:
\’duck duck go\’.split(\’duck\’)将字符串分割成几段:[\’\’, \’ \’, \’ go\’]。[\’\’, \’ \’, \’ go\’].join(\’goose\’) 在元素之间插入\’goose\’并连接起来,得到\’goose goose go\’。
最后我们把这种方式封装成一个帮助函数 replaceAll:
这种方法需要将字符串转换为数组,然后再转换回字符串。这是一种变通方法,但不是一个好的解决方案。
String.prototype。replace(regExp, replaceWith)搜索正则表达式regExp出现的情况,然后使用replaceWith字符串替换所有匹配项。
必须启用正则表达式上的全局标志,才能使replace()方法替换模式出现的所有内容,我们可以这样做:
- 在正则表达式文字中,将g附加到标志部分:/search/g。
- 对于正则表达式构造函数,使用 flags 参数:new RegExp(\’search\’, \’g\’)
我们把所有的duck换成goose:
正则表达式文字/duck/g与\’duck\’字符串匹配,并且启用了全局模式。
\’duck duck go\’.replace(/duck/g, \’goose\’)用\’goose\’替换所有匹配/duck/g字符串。
通过向正则表达式添加i标志,可以忽略大小写:
再次查看正则表达式:/duck/gi。 正则表达式启用了不区分大小写的搜索:i和全局标志g。 /duck/gi匹配\’duck\’,以及\’DUCK\’,\’Duck\’等。
\’DUCK duck go\’.replace(/duck/gi, \’goose\’)以不区分大小写的方式用\’goose\’替换了/duck/gi`所匹配到的结果。
虽然正则表达式替换了所有出现的字符串,但在我看来,这种方法过于繁琐。
当在运行时确定搜索字符串时,使用正则表达式方法不方便。 从字符串创建正则表达式时,必须转义字符-[] / {}()* +? 。 \\ ^ $ |,示例如下:
上面的代码片段尝试将搜索字符串\’+\’转换为正则表达式。 但是\’+\’是无效的正则表达式,因此会引发SyntaxError: Invalid regular expression: /+/异常。
如果replace(search, replaceWith)的第一个参数是字符串,那么该方法只替换search的第一个结果。
\’duck duck go\’.replace(\’duck\’,\’goose\’)仅将\’duck\’的首次出现替换为\’goose\’。
最后,新的提案String.prototype.replaceAll()(在第3阶段)将replaceAll()方法引入到 JavaScript 的字符串中。
replaceAll(search, replaceWith)字符串方法用replaceWith替换所有的search字符串,没有任何变通方法。
我们把所有的duck换成goose:
\’duck duck go\’.replaceAll(\’duck\’, \’goose\’)将所有出现的\’duck\’字符串替换为\’goose\’,这是简单明了的解决方案。
字符串方法replaceAll(search, replaceWith)和replace(search, replaceWith)的行为方式是一样的,除了两件事:
- 如果search参数是一个字符串,那么replaceAll()用replaceWith替换所有出现的search,而replace()只替换第一次出现的search。
2.如果search参数是一个非全局正则表达式,那么replaceAll()将抛出一个TypeError 异常。
替换所有出现的字符串应该很容易。 但是,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/
「Java知识」replace和replaceAll都是替换全部,面试没几个答对
介绍语
本号主要是Java常用关键技术点,通用工具类的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享;datax、kafka、flink等大数据处理框架的技术分享。文章会不断更新,欢迎码友关注点赞收藏转发!
望各位码友点击关注,冲1000粉。后面会录制一些视频教程,图文和视频结合,比如:图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱,码友们冲啊
如果码友觉得代码太长,可以从头到尾快速扫射一遍,了解大概即可。觉得有用后再转发收藏,以备不时之需。
正文:
面试过很多人,几乎所有面试者都说replace是替换第一个,replaceAll替换全部,大家都被这个名字欺骗了,它们都是替换全部。
- 共同点,都是替换全部;都是两个参数;
- 不同点,replace两个参数是普通字符串,而replaceAll第一个参数是正则表达式;
Example源码:
打印的结果:
鄙人编码十年多,在项目中也积累了一些工具类,很多工具类在每个项目都有在用,很实用。大部分是鄙人封装的,有些工具类是同事封装的,有些工具类已经不记得是ctrl+c的还是自己封装的了,现在有空就会总结项目中大部分的工具类,分享给各位码友。如果文章中涉及的代码有侵权行为请通知鄙人处理。
计划是先把工具类整理出来,正所谓工欲善其事,必先利其器。项目中不管是普通单体项目还是多模块maven项目或是分布式微服务,一部分功能模块都是可以重用的,工具类模块就是其中之一。
英语高级表达替换All in all
\”总而言之\”,以你现有的英文水平,你会想到哪些表达呢?
今天我们就来学习一下英语高级替换All in all的更高级表达
相信我,日复一日,你的英语水平一定会提高。跟着我一起学起来吧!
1. Generally speaking 一般来说
Generally speaking, I don\’t like spicy food. 我一般不爱吃辛辣的食物。
2. All things considered 总的来说
All things considered, Mary has done a great job. 总的来说,玛丽做的非常好。
3. In a nutshell 简而言之
In a nutshell, we need to close this gap before launching a new project.
简而言之,开始新项目之前,我们要解决这个差异。
4. To sum up 总而言之
To sum up, Joey is the best student in his class. 总而言之,乔伊是他班上最棒的学生。
5. To make a long story short长话短说
To make a long story short, I am in urgent need of money. 长话短说,我急需要钱。
6. In conclusion 总之
In conclusion, he did not get the prize. 总之,他没有拿到奖。
7. In a word 总之
In a word, you’d better think before you leap. 总之,你得三思而后行。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。