正则的分组捕获
- 简单的分组捕获
之前在写身份证号正则(不完整)的时候,提到过分组捕获
let str = "610524199210264040"
let reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|x)$/
console.log(reg.exec(str));
//或者
console.log(str.match(reg)); // ["610524199210264040", "610524", "1992", "10", "26", "4", "0"] ---- 第一项:大正则匹配的结果;其余项:每个小分组捕获到的结果
/*
* 以上,每个分组都由特定的意义,比如,前6位,代表省市县,紧接4位代表年份...
* 而最后一位(数字或者X),假设没有特殊意义,就是个随机数,
* 因此我们不需要捕获它,可是(\d|x)这个小括号还是不能去的,它的作用是指定优先级的,
* 这时,可以这样(?:\d|x),这样,既解决了不需要捕获的问题,有可以指定优先级。“?:”--只匹配,不捕获
*/
// 需求: 既要捕获到{数字},也要单独的把这个数字也获取到,例如:第一次找到{0},还需要单独获取到这个0;
let str = "{0}年{1}月{2}日";
let reg = /\{\d+\}/; // => [{0}]
reg = /\{(\d+)\}/; // => 加了分组捕获, [{0},0]
//可以看到,效果初步出来了,可是我们要的到的是[{0},0,{1},1,{2},2]
//那好,我们加个全局匹配
reg = /\{(\d+)\}/g;
console.log(str.match(reg)); // ["{0}", "{1}", "{2}"]
// 并不能达到效果,多次匹配的情况下, match只能把大正则匹配的内容获取到,小分组匹配的信息无法获取
// 因此,可以参照上一节execAll的实现方式,分次捕获
let aryBig = [],
arySmall = [],
res = reg.exec(str);
while(res){
aryBig.push(res[0])
arySmall .push(res[1])
res=reg.exec(str);
}
console.log(aryBig, arySmall)
let str = "book"; // “look”,“good”...
let reg = /^[a-zA-Z]([a-zA-Z])\1[a-zA-Z]$/; //分组引用就是通过"\"加数字,让其代表和对应分组出现一模一样的内容
// "对应分组"指的是位置(index),不是个数,一定记住:与对应位置的值**一模一样**