正则的捕获

前端之家收集整理的这篇文章主要介绍了正则的捕获前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

正则的捕获:exec,返回的结果是数组或null

先看个demo

var reg = /\d+/
var str = "hua123hua456";
var result = reg.exec(str);
console.dir(result) // ["123",index: 3,input: "hua123hua456"]
console.log(reg.lastIndex) // 0
console.log(result.input) // 原字符串str
console.log(result.index) // 匹配到字符串的初始index,这里是2

如果你第一次用exec,估计你是猜不到答案的

捕获的结果是一个数组,因为有符合正则的字符串,但是只有一个,而且还是123,不是1,或者12之类的.

这里涉及到捕获的两个特点:贪婪性和懒惰性.

所谓的贪婪性:每次匹配按照匹配最长的结果捕获的,也就是若1符合正则,12也符合正则,那么将捕获12

所谓的懒惰性:每次执行exec只捕获第一个匹配的内容,在不进行任何处理的情况下,捕获的始终是第一个匹配的内容,且正则的lastIndex还是默认的0.

显然真要用的话,这样的缺点很麻烦,所以要克服.

1.克服懒惰性

之前说了一个修饰符,g,恩,这里可以用来解决懒惰性.

加了g之后:正则每一次捕获之后lastIndex的值变成最新的值 下一次捕获从最新的位置开始查找,这样就可以把所有需要捕获的内容获取

看个demo

    var reg = /\d+/g;
    var str = "h123u456";
    console.log(reg.lastIndex); // 0
    console.log(reg.exec(str)); // ["123",index: 1,input: "h123u456"]
    console.log(reg.lastIndex); // 4
    console.log(reg.exec(str)); // ["456",index: 5,input: "h123u456"]
    console.log(reg.lastIndex); // 8
    console.log(reg.exec(str)); // null
    console.log(reg.lastIndex); // 0
    console.log(reg.exec(str)); // ["123",input: "h123u456"]
    console.log(reg.lastIndex); // 8
    console.log(reg.exec(str)); // null

每次捕获到字符串之后,lastIndex会从下一个字符串的位置开始,匹配的结果直到null才算结束,后面会一直重复,所以为了得到所有的字符串,可以写个循环

function findStr (reg,str) {
       var res = reg.exec(str);
       var arr = [];
       while(res){
           arr[arr.length] = res[0];
           res = reg.exec(str);
       }
      return arr;
  }
findStr (
/\d+/g,"hua123hua456"); //["123","456"]

不过其实一般是不用findStr这个方法的,因为字符串对象本身有个match的方法

"123uu556kk90".match(/\d+/g); // ["123","556","90"]别忘了加g,不然只匹配一次,懒惰性

这个方法的缺陷是获得分组的内容,俗称小正则,这个在下一篇文详说

2.克服贪婪性

在量词元字符后面加?即可.

?在正则中的作用:
a. 放在普通的元字符后面表示出现0-1次
b.放在量词元字符后面是取消捕获时候的贪婪性

举个栗子

var regg = /\d+?/g;
findStr (regg,str); // ["1","2","3","4","5","6"]

回忆下量词元字符:*,+,?,{m,n}

总结下:

  解决懒惰性,g

  解决贪婪性,?

原文链接:https://www.f2er.com/regex/358564.html

猜你在找的正则表达式相关文章