zoukankan      html  css  js  c++  java
  • Js replace() 方法笔记

    最近捣鼓着学习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");利用jsRegExp()对象就行了。

    另外还有一些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为原字符串;

  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/anniey/p/6170517.html
Copyright © 2011-2022 走看看