zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    python 元组操作
    python安装(python2.7)
    0、
    1、Centos 7 系统的初化始配置
    C# 6.0新特性
    ios学习之路
    Can 't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock '(2) ;
    px,em,rem,vw单位在网页和移动端的应用
    html5shiv.js和respond.min.js
    display:inline-block间隙问题
  • 原文地址:https://www.cnblogs.com/liulangbxc/p/14658911.html
Copyright © 2011-2022 走看看