正则捕获

正则捕获

var reg = /\d+/;
var str = '2016pku2017';
var res = reg.exec(str);
console.log(res); // ["2016", index: 0, input: "2016pku2017"]

捕获的格式

每一次捕获的时候都是先进行默认的匹配,如果没有匹配成功,捕获的结果是null,只有能匹配的内容才能捕获

1. 捕获到的内容是一个数组,数组中的第一项是捕获的内容

index: 捕获内容在字符串中开始的索引位置
input: 捕获的原始字符串

2. 正则匹配的特点

2.1懒惰型:exec只捕获第一个匹配的内容(在不进行任何处理的情况下)

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

2.2 如何解决懒惰型? 在正则的末尾加一个修饰符’g’

修饰符: g , i, m
g -> global 全部匹配
i -> ignoreCase 忽略大小写
m -> multiline 多行匹配

var reg = /\d+/g;
var str = '2016pku2017';

console.log(reg.lastIndex); // 0
console.log(reg.exec(str)); // ["2016", index: 0, input: "2016pku2017"]
console.log(reg.lastIndex); // 4
console.log(reg.exec(str)); // ["2017", index: 7, input: "2016pku2017"]

console.log(reg.lastIndex); // 11
console.log(reg.exec(str)); // null

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

var arr = [];
var res = reg.exec(str);
while(res){
  arr.push(res[0]);
  res = reg.exec(str);
}
console.log(arr); // ["2016","2017"]
2.3 贪婪性:正则的每一次捕获都是按照匹配最长的结果捕获的
var reg = /\d+/g; // 出现一到多个0-9之间的数字
var str = '2016pku2017';
console.log(reg.exec(str)); // ["2016", index: 0, input: "2016pku2017"]
2.4 如果解决正则的贪婪性 : 在量词元字符后面添加一个”?”即可

“?” 的作用:
放在一个普通的元字符后面代表出现0-1次 /\d?/
放在一个量词的元字符后面是取消捕获时的贪婪性

var reg = /\d+?/g; // 出现一到多个0-9之间的数字
var str = '2016pku2017';
console.log(reg.exec(str)); // ["2", index: 0, input: "2016pku2017"]

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

var reg = /\d+?/g; // 出现一到多个0-9之间的数字
var str = '2016pku2017';
var arr = str.match(reg);
console.log(arr);// ["2", "0", "1", "6", "2", "0", "1", "7"]

虽然match比exec更简便,但是match存在一些自己处理不了的问题:在分组捕获的情况下,match只能捕获大正则匹配的内容,而对于小正则捕获的内容时无法捕获的

4. 正则分组

1. 改变优先级
2. 分组引用
var reg = /^(\w)\1(\w)\2$/;
console.log(reg.test('aabb')); // true

\1 代表和第一个分组出现一模一样的内容;
\2 代表和第二个分组出现一模一样的内容;

3. 分组捕获 正则在捕获的时候,不仅仅把大正则匹配的内容捕获到,而且还可以把小分组匹配的内容捕获到
 var reg = /^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(\d{3})(\d|X)$/;
 var str = "380524198002300016";
 console.log(reg.exec(str)); // ["380524198002300016", "38", "0524", "1980", "02", "30", "001", "6", index: 0, input: "380524198002300016"]

第一项 是大正则匹配的内容
第二项 第一个分组捕获的内容
第三项 第二个分组捕获的内容

(?:) 在分组中?: 代表只匹配不捕获

var reg = /^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(?:\d{3})(\d|X)$/;
var str = "380524198002300016";
console.log(reg.exec(str)); // ["380524198002300016", "38", "0524", "1980", "02", "30", "6", index: 0, input: "380524198002300016"] 没有获取带?:的内容
console.log(str.match(reg)); // 结果和上例exec一致

下例说明match和exec的不同之处

var reg = /pku(\d+)/g;
var str = "pku2014pku2015pku2016pku2017";
console.log(reg.exec(str)); // ["pku2014", "2014", index: 0, input: "pku2014pku2015pku2016pku2017"]
console.log(reg.exec(str)); // ["pku2015", "2015", index: 7, input: "pku2014pku2015pku2016pku2017"]
console.log(reg.exec(str)); // ["pku2016", "2016", index: 14, input: "pku2014pku2015pku2016pku2017"]

console.log(str.match(reg)); //  ["pku2014", "pku2015", "pku2016", "pku2017"]

match只能捕获大正则匹配的内容,分组内容无法获取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值