zoukankan      html  css  js  c++  java
  • 41.正则中懒惰性和贪婪性

    1. exec 正则的捕获

      每一次捕获的时候,都是先进行默认的匹配,如果没有匹配成功的,捕获的结果是null,只有有匹配的内容,我们才能捕获到,捕获的内容格式是一个数组

      1)捕获的内容格式:

        a)捕获到的内容是一个数组,

          数组中的第一项:当前大正则捕获的内容

          第二项index:捕获内容在字符串中开始的索引位置

          第三项input:捕获的原始字符串

        var reg = /d+/;
    
        var str = "zhangsan2015zai2017"
        var res = reg.exec(str);
        console.log(res) // ->["2015", index:9, input:"zhangsan2015zai2017"]
    
        // 我们第二次通过exec捕获的内容还是第一个“2015”
        res = reg.exec(str);
    
        console.log(res) // ->["2015", index:8, input:"zhangsan2015zai2017"]

      2)正则捕获的特点

        a)懒惰性->每一次执行exec只捕获第一个匹配的内容,在不进行任何处理的情况下,在执行多次捕获,捕获的还是第一个匹配的内容

          lastIndex:是正则每一次捕获在字符串中开始查找的位置,默认的值是0

          var reg = /d+/;
    
          var str = "zhangsan2015zai2017"
          console.log(reg.lastIndex); // 0
          var res = reg.exec(str)
          console.log(reg.lastIndex); // 0 说明我们第二次捕获的时候也是要从字符串索引0处开始查找的
    
          var res = reg.exec(str)
          console.log(res) // ->["2015", index:8, input:"zhangsan2015zai2017"]

         b)如何解决懒惰性?在正则的末尾加一个修饰符“g”

          修饰符:g,i,m

            1))global(g):全局匹配

            2)ignoreCase(i):忽略大小写匹配

            3)multiline(m):多行匹配

            原理:加了全局修饰符g,正则每一次捕获结束后,我们的lastIndex的值都变为了最新的值,下一次捕获从最新的位置开始查找,这样就可以把所有需要捕获的内容都获取到了

          var reg = /d+/g;
          var str = "zhangsan2015zai2017"
          console.log(reg.lastIndex); // 0
          console.log(reg.exec(str)); //->["2015"...]
          console.log(reg.lastIndex); // 12
          console.log(reg.exec(str)); //->["2017"...]
          console.log(reg.lastIndex); // 19
          console.log(reg.exec(str)); //->null
        c)自己编写程序获取正则捕获的所有内容(一定不要忘记加g)
          eg:
          var reg = /d+/g
          var str = "zhangsan2015zaizhe2016yangfan2017"
          var ary = [];
          var res = reg.exec(str);

          while(res) {

            ary.push(res[0]);

            res = reg.exec(str);

          }

          console.log(ary)

        d)正则贪婪性:正则每一次捕获都是按照匹配最长的结果捕获的,例如:2符合正则2015也符合正则,我们默认捕获的是2015

          var reg = /d+/g; // 出现一到多个0-9之间的数字

          var str = "zhangsan2015zaizhe2016yangfan2017"

          console.log(reg.exec(str)); // [2015...]

        e)如何解决正则的贪婪性:在量词元字符后面添加一个?即可

          ?在正则中有很多的作用:(5中作用)

          1.放在一个普通的元字符后面代表出现0-1次    /d?/数字可能出现也可能不出现

          2.放在一个量词的元字符后面是取消捕获时候的贪婪性 

          var reg = /d+?/g; // 

          var str = "zhangsan2015zaizhe2016yangfan2017"

          var ary = [],res = reg.exec(str);

          console.log(reg.exec(str)) // [2...]

          while (res) {

            ary.push(res[0]);

            res = reg.exec(str)

          }

          console.log(ary); // [2,0,1,5,2,0,1,6,2,0,1,7]

    2.字符串中的match方法 -》把所有和正则匹配的字符都获取到

      var reg = /d+?/g;

      var str = "zhangsan2015zaizhe2016yangfan2017";

      var ary = str.match(reg);

      console.log(ary);  

      虽然在当前的情况下,我们的match比我们的exec更加的简洁一些,但是match中存在一些自己处理不了的问题:

        在分组捕获的情况下,match只能捕获到大正则匹配的内容,而对于小正则捕获的内容是无法获取的

      

  • 相关阅读:
    【leetcode】Binary Search Tree Iterator
    【leetcode】Palindrome Partitioning II
    【leetcode】Best Time to Buy and Sell Stock III
    【leetcode】Best Time to Buy and Sell Stock II
    【leetcode】Longest Consecutive Sequence
    【leetcode】Factorial Trailing Zeroes
    【leetcode】Simplify Path
    【leetcode】Generate Parentheses
    【leetcode】Combination Sum II
    【leetcode】Combination Sum
  • 原文地址:https://www.cnblogs.com/z-dl/p/8968946.html
Copyright © 2011-2022 走看看