网上 copy 的一段 javascript 代码 String.prototype.replaceAll = fucntion(){...} 存在问题
早些年,浏览器没有内置 字符串的 replaceAll()方法,就从网上 copy 了一段 replaceAll() 的实现:
String.prototype.replaceAll=function(AFindText,ARepText){raRegExp=new RegExp(AFindText,"g");return this.replace(raRegExp,ARepText)}
今天突然遇到一个问题,定位到了这段代码,我才发现,这个实现存在问题:
var str = "aaa\\\\bbb"; //当代码中含有两个连续的 '\' console.log(str.replaceAll("\\", "\\\\"));
控制台直接抛出错误:
VM25:1 Uncaught SyntaxError: Invalid regular expression: /\/: \ at end of pattern
at new RegExp (<anonymous>) at String.replaceAll (<anonymous>:1:67)
at <anonymous>:1:17
后来找到一篇相关的介绍:
Node.js和javascript中RegExp对象的风险及防范
https://www.jianshu.com/p/67aeaf115a2d
才搞明白缘由。
正确的实现:
if(String.prototype.replaceAll == null){ String.prototype.replaceAll=function(AFindText,ARepText){AFindText=AFindText.replace(/\\/ig, "\\\\");raRegExp=new RegExp(AFindText,"g");return this.replace(raRegExp,ARepText)}}
主要增加了这么一句:
AFindText=AFindText.replace(/\\/ig, "\\\\");
网上关于 String.prototype.replaceAll=function(...){...} 的实现基本上都存在这个问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架