• String.prototype.replace( )


    调用replace()找出每一个匹配的结果是相互独立的。先看例子:

    var text  = "cat,bat,sat,fat";
    var pattern = /(.at)/g;
    var res = text.replace(pattern,'world($1,$2)');
    //world(cat,$2),world(bat,$2),world(sat,$2),world(fat,$2)
    

    我的理解是,replace用模式pattern去匹配,第一次匹配到了cat,因为有括号所以记下了该捕获组,可以通过$1来引用该字符子串,然后replace接着往后匹配,这是第二次,而且相对第一次是独立的,这次匹配到的是bat,于是通过$1可以引用bat。依次匹配,各自的$1都是最新的一次匹配的第一个捕获组的引用,所以替换是才各不相同。
    可以通过修改模式pattern来验证,这次是一次匹配两个单词

    var text  = "cat,bat,sat,fat";
    var pattern = /(.at)S(.at)/g;
    var res = text.replace(pattern,'world($1,$2)');
    //world(cat,bat),world(sat,fat)
    

    加括号和不加括号的区别是前者可以对捕获组进行引用

    可以看到,上面的匹配中,每一次都是独立的,就有点像是循环,所以使用行内函数和正则来避免循环
    输入:
    一个由 x,- 和 _ 组成的字符串。

    x-x_
    
    ---x---x---x---
    
    -xxx-xx-x-
    
    _x_x___x___x___
    

    输出:

    一个数组对象。'x' 产生一个 'on' 状态,'-'(连接符)产生一个 'off' 状态,而 '_' (下划线)表示 'on' 状态的长度。

    [
      { on: true, length: 1 },
      { on: false, length: 1 },
      { on: true, length: 2 }
      ...
    ]
    

    代码片段:

    var str = 'x-x_';
    var retArr = [];
    str.replace(/(x_*)|(-)/g, function(match, p1, p2) {
      if (p1) { retArr.push({ on: true, length: p1.length }); }
      if (p2) { retArr.push({ on: false, length: 1 }); }
    });
    
    console.log(retArr);
    

    不难看出,p1相当于$1,p2相当于$2

    感谢阅读!

    参考:
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace

  • 相关阅读:
    知识的本质
    福克斯保养注意事项及驾驶技巧
    转 网络编程
    Linux系统下安装 apache2.4的过程
    代码静态检查工具PCLint运用实践
    gcc编译系统
    量子计算机:决胜21世纪的利器
    关于ETL工具、方案的认识
    《HTTP: The Definitive Guide》读书笔记
    ArrayList(转用法)
  • 原文地址:https://www.cnblogs.com/liulangbxc/p/14658911.html
Copyright © 2020-2023  润新知