正则表达式之捕获
语法: 正则.exec(字符串)
1: 字符串中没有符合正则规则的内容,返回结果为null
var reg = /\d{3}/
console.log(reg.exec('abcdefg')) // null
2: 正则没有小括号, 没有标识符 g,捕获到的是一个数组,下标0 是我们捕获到的值,但是不管捕获多少次,都是从下标[0]开始,第一个满足条件的
var reg = /\d{3}/
console.log(reg.exec('123asd456df789')) // 第一次捕获,[0]是123
console.log(reg.exec('123asd456df789')) // 第二次捕获,[0]还是123
3: 有小括号,捕获到的是数组,下标[0]是符合正则规则的字符串,从下标1开始,捕获到的是每个小括号单独捕获出来的内容
var reg = /(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/
console.log(reg.exec('371522199702053456'))
// 这里捕获到的是一个数组,下标[0]是这个完整的字符串,然后后面的下标上面是每个小括号里的匹配到的两个值,依次向后排列
4: 有标识符g, g 叫做全局标识符,第二次捕获的时候,会从第一次捕获结束的位置开始往后捕获,直到找不到内容,会返回一个 null,然后再下一次捕获的时候,会从字符串开始位置重新捕获
var reg = /\d{2}/g
console.log(reg.exec('123')) // 12
正则的两大特性
1. 懒惰
每次捕获都是在下标[0]的位置开始捕获 解决: 在正则后添加全局标识符 g
var reg = /\d{3}/g
console.log(reg.exec('123asd456fgg789')) // 123
console.log(reg.exec('123asd456fgg789')) // 456
console.log(reg.exec('123asd456fgg789')) // 789
2. 贪婪
每次捕获内容的时候,尽可能的多去捕获 解决: 使用非贪婪限定符 (在原有的限定符后添加一个?)
var reg = /<div.*>/
var str = '<div class="box" id="box1"><span></span></div>'
console.log(reg.exec(str)[0]);
// 输出结果为: <div class="box" id="box1"><span></span></div>
var reg1 = /<div.*?>/
console.log(reg1.exec(str)[0]);
// 输出结果为: <div class="box" id="box1">
正则两种创建方式的区别
书写标识符
字面量的方式,直接在正则后书写标识符
内置构造函数的方式,需要写在第二个参数中