既要捕获到{数字},也想单独的把数字也获取到
例如:
第一次找到 {0} 还需要单独获取0
let str = "{0}年{1}月{2}日";
不设置g只匹配一次,exec和match获取的结果一致(既有大正则匹配的信息,也有小分组匹配的信息)
let reg = /\{(\d+)\}/;
console.log(reg.exec(str));
console.log(str.match(reg));
//["{0}", "0",...]
let reg = /\{(\d+)\}/g;
//console.log(str.match(reg)); //=>["{0}", "{1}", "{2}"] 多次匹配的情况下,match只能把大正则匹配的内容获取到,小分组匹配的信息无法获取
//这时可以自己实现一下,同时获取大分组和小分组
let aryBig=[],
arySmall=[],
res=reg.exec(str);
while(res){
let [big,small]=res;
aryBig.push(big);
arySmall.push(small);
res=reg.exec(str);
}
console.log(aryBig,arySmall); //=>["{0}", "{1}", "{2}"] ["0", "1", "2"]
分组的第三个作用:“分组引用”
let str = "book"; //=>"good"、"look"、"moon"、"foot"...
let reg = /^[a-zA-Z]([a-zA-Z])\1[a-zA-Z]$/; //=>分组引用就是通过“\数字”让其代表和对应分组出现一模一样的内容
console.log(reg.test("book")); //=>true
console.log(reg.test("deep")); //=>true
console.log(reg.test("some")); //=>false
“\数字”制定了带圆括号的子表达式在正则表达式中位置。
例如:
“\1”引用的是第一个带圆括号的子表达式
“\3”引用的是第三个带圆括号的子表达式
/['"][^'"]*['"]/
/(['"])[^'"]*\1/
/(\d{2})(\d{3})(\d{4})[xyz](\d{2})(\d{3})(\d{4})/
/(\d{2})(\d{3})(\d{4})[xyz]\1\2\3/