正则表达式的分组捕获和分组引用

156 阅读1分钟

既要捕获到{数字},也想单独的把数字也获取到

例如:

第一次找到 {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/