回顾上一节,我们知道正则表达式是有元字符和修饰符组成的,这一节我们首先来了解下修饰符有哪几个。
相比于元字符, 修饰符 就很好记了,一共就只有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开始,第一次捕获成功后停止查找。
那么如何解决正则捕获的懒惰性呢?这就要用到开篇我们提到的修饰符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方法主要就是这两个特点,但是在使用时有点小麻烦,下一讲里会有新的方法捕获哦~
网友评论