// 身份证号码
let str = '36252819950508056X';
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));
// 以上两个打印都是一样
// ["36252819950508056X", "362528", "1995", "05", "08", "6", index: 0, input: "36252819950508056X", groups: undefined]
// 第一项:大正则匹配的结果
// 其余项:每一个小分组单独匹配捕获的结果
// 如果设置了分组(改变优先级),但是捕获的时候不需要单独捕获,可以给予?:来处理
// 既要捕获到{数字},也想单独的把数字也获取到,例如:第一次找到{0} 还需要单独获取0
let str = '{0}年{1}月{2}日';
// 不设置g只匹配一次,exec和match获取的结果一致(既有大正则匹配的信息,也有小分组匹配的信息)
let reg = /\{(\d+)\}/;
console.log(reg.exec(str));
// ["{0}", "0", index: 0, input: "{0}年{1}月{2}日", groups: undefined]
console.log(str.match(reg));
// ["{0}", "0", index: 0, input: "{0}年{1}月{2}日", groups: undefined]
let reg = /\{(\d+)\}/g;
console.log(str.match(reg)); // ["{0}", "{1}", "{2}"]
// 多次匹配的情况下,match只能把大正则匹配的内容获取到,小分组匹配的信息无法获取
//写个方法实现上面需求
let aryBig = [];
let arySmall = [];
let 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