最近捣鼓着学习Js,发现replace()真的很有用,替换功能杠杠的棒。
接下来看看我遇到的问题:
有两个随机给出的字符串,字符串1'xxxxxx',字符串2'====T'(这两个用作示例,其他为随机),根据这两个字符串最后输出'ooooox'。后面会给出测试用例,大家就会明白。
刚开始遇到这个问题的时候我就想这就是合并两个字符串,顺带替换了字符串1。
1 var n=drone.length; 2 var l; 3 l=lamps.replace(/^(x){n}/,'o');
没错,这就是我开始的思路,以致于我后来死脑筋没转出来自己挖的坑,在替换过程中replace()被我丢弃了没使用。
然后开始动手填自己的坑,开始写方法。
第一种
1 function strOperate(lamps, drone){ 2 console.log(lamps.length,drone.length);//打印两个字符串的长度 3 var str="",lamps; 4 //根据第二个字符串的长度先把要替换的'o'先保存在字符串中; 5 for(var i=0;i<drone.length;i++){ 6 str+="o"; 7 } 8 //数组操作 9 str=str.split(""); 10 lamps=lamps.split(""); 11 //两个字符串长度比较 12 var length=lamps.length<str.length?lamps.length:str.length; 13 for(var i=0;i<length;i++){ 14 lamps[i]=str[i]; 15 } 16 lamps=lamps.toString().replace(/,/g,"");//字符串替换, 17 console.log(lamps); 18 } 19 strOperate('xxxxxx', '====T')//输出 'ooooox'
这样一个方法写下来不知道浪费了多少时间,而且代码冗长,好悲伤呀。
后来细想,我为什么一定要把自己拴在替换字符串上面呢,可以换一种思路来,就有了以下的方法。
第二种
1 function flyBy(lamps, drone){ 2 //转换为数组操作 3 var l=lamps.split(""); 4 var d=drone.split(""); 5 for(var i=0;i<d.length;i++){ 6 //比较字符串长度大小 7 if(i<l.length){ 8 l[i]='o';//直接赋值覆盖掉 9 } 10 } 11 console.log(l.join(""));//最后转换输出字符串 12 } 13 strOperate('xxxxxx', '====T')// 输出 'ooooox'
虽然这两个方法使用同样的原理,但是第二个方法简单明了而且可读性强,请认准第二个。
第三种使用replace()替换
1 function strOperate(lamps, drone){ 2 var str; 3 if(drone.length>lamps.length){ 4 str='o'.repeat(lamps.length) 5 } 6 str=lamps.replace('x'.repeat(drone.length),'o'.repeat(drone.length)) 7 console.log(str); 8 } 9 strOperate('xxxxxx', '====T')// 输出 'ooooox'
1 //测试用例: 2 strOperate('xxxxxx', '====T')// 'ooooox' 3 strOperate('xxxxxxxxx', '==T')// 'oooxxxxxx' 4 strOperate('xxxxxxxxxxxxxxx', '=========T')// 'ooooooooooxxxxx' 5 strOperate('xxxx', '====T')// 'oooo'
方法写完了,最后还是要记下笔记的。(认真脸.png)
Replace()方法使用:
strObj.replace(regex/substr[,replacement]);
参数:
substr用一些字符串替换;
regex用一个正则表达式匹配的子串替换;
replacement为参数2,是需要替换的文本或函数;
在网上看到了一个有趣的说法,怎样在正则中传入变量,大家想一想是否跟普通的变量用加号拼接呢?
其实答案很简单,string.replace(new RegExp(key,'g'),"o");利用js的RegExp()对象就行了。
另外还有一些replace()特性没有说明,有兴趣的童鞋可以查查资料。
最后记下这些内容,来提示自己,期待下次提高。
~~~~~~~~~~~~~~~~~~2016/12/27 update~~~~~~~~~~~~~~~~~~
再来补充一下 replace()的回调函数使用!
replace() 方法的第二个参数 replacement 可以是函数,并且每个匹配到的元素都会调用该回调,最后返回的字符串作为替换使用。
先举个例子:
1 var string="Hello, I am Mr yt"; 2 var str; 3 str=string.replace(/[^aeious]/gi,function (s){ 4 console.log(s);//string, m r b 5 return s==s.toLowerCase()?s+'err':s+'ERR'; 6 }) 7 console.log(str);//最后输出"Hello, I amerr Mrerr yterr"
备注:参数s为正则匹配到的子串,最后return的就是替换的子串。
对于有变量的正则replacement 函数有4(n+3)个参数,n为分组的个数;
其中的4个参数可以理解为:
function(m,v,i,s){}
m为匹配到的字符串,v为变量值,i为在原字符串中找到匹配元素的下标索引值,s为原字符串;