当前位置: 首页 > Web前端 > HTML

原生js实现replace方法

时间:2023-04-02 18:08:20 HTML

今天看到有人问怎么实现js的replace方法,于是自己试了一下。js手动replace中String对象的引入大概是这样的:string.replace(regexp,replacement)第一个参数:(regexp)一个RegExp对象,声明了要替换的模式。如果参数是字符串,则将其用作要检索的文字文本模式,而不是先转换为RegExp对象。第二个参数(替换)是声明替换文本的字符串或生成替换文本的函数。有关详细信息,请参阅描述部分。返回值是用replacemenc替换regexp的第一个或所有匹配得到的新字符串。我尝试在不考虑规律性的情况下实现下一个想法。有很多问题。修改思路:使用正则exec(),使用split将匹配到的字符串作为参数将原字符串拆分成若干个Array,然后将字符串和替换后的内容拼接起来,执行exec()会检索字符串string并得到匹配正则表达式regexp的文本。如果exec()找到匹配的文本,它会返回一个结果数组。否则,返回空值。第一个匹配的array[0]:匹配的文本,第二个元素是regexp第二个子表达式匹配的文本,以此类推。通常,数组的长度属性声明数组中元素的数量。除了数组元素和长度属性之外,exec()还返回两个属性。index属性声明匹配文本的第一个字符的位置。输入属性指的是字符串。调用非全局RegExp对象的exec()方法时,返回的数组与调用String.match()方法返回的数组相同。String.prototype.replaces=function(reg,str){vararr=[];varnewStr=这个;变种我='';//循环直到替换字符串不匹配while(reg.exec(newStr)!='null'){/**使用try和catch是因为循环匹配完所有!=null后,下一个循环reg.exec(newStr)[0]会报错,循环结束报错时直接返回结果**/try{arr=newStr.split(reg.exec(newStr)[0]);newStr=arr.join(str);//如果正则表达式不是全局正则表达式(/g),不循环修改一次返回if(!reg.global){returnnewStr;}}catch(e){返回newStr;}}}console.log("我是AbCd,abcd,abcd".replaces(/abcd/gi,'lipengpeng'))----------------------------------------------------经过测试,上面代码中的问题如下:当正则表达式是全局的(/g),只匹配到一个,直接返回原字符串。循环reg.exec(newStr)时,每次结果都不一样,这里不清楚原因。修改:String.prototype.replaces=function(reg,str){vararr=[];varnewStr=这个;变种我='';变量d;//为了防止reg.exec()的结果每次都不一样,直接赋值给一个变量//这里注意给d=reg.exec()加上括号,“=”的优先级为低而((d=reg.exec(newStr))!=null){尝试{arr=newStr.split(d[0]);newStr=arr.join(str);如果(reg.global){返回newStr;}else{休息;}}catch(e){控制台。log(e)}}}------------------------------------分割线------------------------------------以上代码继续测试后发现,如果正则模式匹配不区分大小写(/i)并且不开启全局匹配,结果会被全局替换添加非全局代码,不管case是全局还是非全局(正则性已经处理),最终代码:String.prototype.replaces=function(reg,str){vararr=[];varnewStr=这个;变种我='';变量d;while((d=reg.exec(newStr))!=null){//调试器尝试{//console.log(d)if(reg.global){arr=newStr.split(d[0]);newStr=arr.join(str);}else{varindex=d['index'];varlastindex=(+index)+(+d[0].length);varpreStr=newStr.slice(0,index);varnextStr=newStr.slice(lastindex);newStr=preStr+str+nextStr;休息;}}catch(e){console.log(e)}}returnnewStr}vars="iisA,c,a,cc,c,c,cc,a".replaces(/a/ig,'b')console.log(s)