美文网首页
javascript正则表达式----分组捕获

javascript正则表达式----分组捕获

作者: 成熟稳重的李先生 | 来源:发表于2019-10-16 02:00 被阅读0次

    正则的分组捕获

    • 简单的分组捕获
      之前在写身份证号正则(不完整)的时候,提到过分组捕获
    let str = "610524199210264040"
    let reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|x)$/
    console.log(reg.exec(str)); 
    //或者
    console.log(str.match(reg)); // ["610524199210264040", "610524", "1992", "10", "26", "4", "0"] ---- 第一项:大正则匹配的结果;其余项:每个小分组捕获到的结果
    /*
     * 以上,每个分组都由特定的意义,比如,前6位,代表省市县,紧接4位代表年份...
     * 而最后一位(数字或者X),假设没有特殊意义,就是个随机数,
     * 因此我们不需要捕获它,可是(\d|x)这个小括号还是不能去的,它的作用是指定优先级的,
     * 这时,可以这样(?:\d|x),这样,既解决了不需要捕获的问题,有可以指定优先级。“?:”--只匹配,不捕获
    */
    
    • 分组多次捕获
      假设有这种需求:
    // 需求: 既要捕获到{数字},也要单独的把这个数字也获取到,例如:第一次找到{0},还需要单独获取到这个0;
    let str = "{0}年{1}月{2}日";
    let reg = /\{\d+\}/;  //  => [{0}]
    reg = /\{(\d+)\}/;  // => 加了分组捕获, [{0},0]
    //可以看到,效果初步出来了,可是我们要的到的是[{0},0,{1},1,{2},2]
    //那好,我们加个全局匹配
    reg = /\{(\d+)\}/g; 
    console.log(str.match(reg)); // ["{0}", "{1}", "{2}"]
    // 并不能达到效果,多次匹配的情况下, match只能把大正则匹配的内容获取到,小分组匹配的信息无法获取
    // 因此,可以参照上一节execAll的实现方式,分次捕获
    let aryBig = [],
      arySmall = [],
      res = reg.exec(str);
    while(res){
      aryBig.push(res[0])
      arySmall .push(res[1])
      res=reg.exec(str);
    }
    console.log(aryBig, arySmall)
    
    • 分组引用
    let str = "book";  // “look”,“good”...
    let reg = /^[a-zA-Z]([a-zA-Z])\1[a-zA-Z]$/;  //分组引用就是通过"\"加数字,让其代表和对应分组出现一模一样的内容
    // "对应分组"指的是位置(index),不是个数,一定记住:与对应位置的值**一模一样**
    
    image.png

    相关文章

      网友评论

          本文标题:javascript正则表达式----分组捕获

          本文链接:https://www.haomeiwen.com/subject/myzemctx.html