美文网首页
js正则基础入门2

js正则基础入门2

作者: 嘿喵heyMeow | 来源:发表于2017-03-03 20:16 被阅读0次

           回顾上一节,我们知道正则表达式是有元字符和修饰符组成的,这一节我们首先来了解下修饰符有哪几个。
           相比于元字符, 修饰符 就很好记了,一共就只有3个。
           i : ignoreCase 忽略字母的大小写
           m : multiline 多行匹配
           g: global 全局匹配

    正则的创建

           不要忘记正则也是对象,所以,正则也可以有两种方式创建:字面量和实例创建。而两者之间也是有区别的。

    • 字面量方式中出现的都是元字符,所以不能进行变量值的拼接,而实例创建的方式是可以的。
    • 字面量方式中直接写\d就可以,但是实例创建中需要将它转义 --> \d。
    正则的捕获
    RegExp.prototype

           上图是正则的原型上的方法,test我们上一节已经用到了,是用来检测是否完全匹配的,返回值是布尔类型。另一个红色框里的exec就是我们这节要学习的正则的捕获,简单来说就是用来求出一个字符串中能够匹配出的值。
           我们先来简单了解下exec是个啥:

    var reg = /\d\d/;
    var str = "love2016you2017";
    console.log(reg.exec(str));
    

    返回结果看下图:

    控制台输出结果

           从图中看出,正则的exec返回的是一个数组,数组的长度是1,且元素的值是从字符串中匹配到的“20”。这个数组还有两个属性,一个是index,不难猜出,这个 index 代表的是捕获内容在字符串中开始的索引位置;另一个属性 input 是捕获的原始字符串。

    从上边的捕获结果我们发现,只有“20”捕获到了,但是后边的16、20、17也都符合匹配啊,为什么没有捕获到呢?这就是正则的一个特点:懒惰性!

    • 正则的特点1:懒惰性
             每一次执行exec只捕获第一个匹配的内容,在不进行任何处理的情况下,执行多次捕获还是第一个匹配的内容。
      这是因为正则有这样一个属性lastIndex,是正则每一次捕获在字符串中开始查找的位置,默认值是0,所以每次捕获都是从0开始,第一次捕获成功后停止查找。
    lastIndex

           那么如何解决正则捕获的懒惰性呢?这就要用到开篇我们提到的修饰符g了。
           解决方案:在正则的末尾加一个修饰符g。
           原理:加了全局修饰符g后,正则每一次捕获结束后,lastIndex值就会变为最新的值,下一次捕获就会从最新的位置开始查找。

    var reg = /\d\d/g;
    var str = "love2016you2017";
    console.log(reg.lastIndex);
    console.log(reg.exec(str));
    
    console.log(reg.lastIndex);
    console.log(reg.exec(str));
    
    console.log(reg.lastIndex);
    console.log(reg.exec(str));
    
    console.log(reg.lastIndex);
    console.log(reg.exec(str));
    
    修饰符g解决正则的懒惰性

           为了一次性捕获所有内容,可以写个循环,并把每次捕获到的结果放到一个数组里。

    var reg = /\d\d/g;
    var str = "love2016you2017";
    var arr = [];
    var res = reg.exec(str);
    while(res){
        arr.push(res[0]);
        res = reg.exec(str);
    }
    console.log(arr);  // --> ["20", "16", "20", "17"]
    
    • 正则的特点2:贪婪性
      正则不仅有懒惰性,还有贪婪性。请看以下代码:
    var reg = /\d+/g;
    var str = "love2016you2017";
    var res = reg.exec(str);
    console.log(res[0]);  // --> 2016
    

    reg= /\d+/g; 表示的是匹配一到多个0~9之间数字,从结果上看第一次捕获的结果是2016,然而2、20、201也符合捕获结果啊?为什么偏偏是2016呢?这就是正则的另一个特点:贪婪性。
           正则的每一次捕获都是按照最大的结果捕获,这就是正则的贪婪性。我们同样需要解决贪婪这个问题。
           解决方案:在量词元字符后面添加一个“?”。
           (“?”放在普通元字符后代表出现0-1次;
               “?”放在量词元字符后是曲线捕获时的贪婪性)

    var reg = /\d+?/g;
    var str = "love2016you2017";
    var arr = [];
    var res = reg.exec(str);
    while(res){
        arr.push(res[0]);
        res = reg.exec(str);
    }
    console.log(arr);  // --> ["2", "0", "1", "6", "2", "0", "1", "7"]
    

           正则自带的捕获exec方法主要就是这两个特点,但是在使用时有点小麻烦,下一讲里会有新的方法捕获哦~

    相关文章

      网友评论

          本文标题:js正则基础入门2

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