前言
上节我们介绍了正则中的反向引用,在特定情况下反向引用能够让我们的正则更加简洁,下面我们围绕这该引用做下拓展,讨论一下反向引用的几种情况。
未匹配分组
反向引用使用\+数字表示的,我们提到过数字表示的是表示式中第几个分组,如果我们写的数组没有匹配到对应的分组,此时又是什么含义呢?我们可以试一下。
const reg = /(\d)\2/;
const str = '1\2';
const str1 = '12';
console.log(reg.test(str)); // true
console.log(reg.test(str1)); // false
上述正则匹配到的字符串是数字+'\2',也就是说当引用不存在的分组时就会当成字符串去处理。
括号嵌套
当有括号嵌套的分组时,注意不要把整体当成一个分组,每个括号内都是一个分组。碰到嵌套时候我们只需要找左括号即可,第一个左括号表示\1,以此类推。
const reg = /^(\d(\d))\1\2$/;
const str = '12122';
const str1 = '1234';
console.log(reg.test(str)); // true
console.log(reg.test(str1)); // false
稍微分析一下代码:
- 第一个左括号是第一个分组,匹配两个数字,匹配str时匹配到了12,此时\1表示的就是12。
- 第二个左括号是第二个分组,匹配一个数字,str中该数字是2,所以\2表示的就是2,两步结合起来就是12122。
括号嵌套的时候我们要清楚总共有几个分组,代表着什么,这样用反向引用的时候才能准确写出来。
量词加分组
当我们分组后面有量词的时候,分组引用的是最后一次匹配。加量词会匹配多次,最后一次匹配到的字符就是反向引用代表的。
const reg = /(\d){1,2}\1/;
const str = '122';
const str1 = '123';
console.log(reg.test(str)); // true
console.log(reg.test(str1)); // false
以上正则去匹配str时,分组表示一个数组,最多匹配两次,此时匹配到的字符就是2,所以\1代表的就是2,所以'122'返回true。
总结
反向引用不同情况下表示的含义有所不同,对应不同的情况我们还是要掌握住,错一个正则就匹配不到。