正则学习(七)——反向引用

247 阅读2分钟

前言

之前我们讲解了括号的引用作用,正则会专门开辟一个内存空间去保存括号内匹配的字符,除此以外括号还能反向引用,下面我们就来看一下反向引用。

反向引用

反向引用是什么意思呢?简单来说就是引用括号内的分组,比如正则中有个分支(a|b|c)那么我们就看用符号表示a在后面的表示式中实现,注意这里的引用只能引用前面出现的分组。为了更好理解,我们来做一个简单案例。 有两种日期的表述格式:2023/06/12、2023-06-13,给我们一个日期,判断一下是否符合二种格式的一种。首先先来分析,日期都是数字用\d加量词就能表述出来,然后第一个符号是/与-的一种,用分组轻松表述。重点是后面那个符号,如果也用一个分组去表述,那么2023/06-13这种情况也会为true,匹配结果明显不对。简单粗暴的思路就是将整体一个分组:

     // /字符需要转义一下
      const reg = /(\d{4}-\d{2}-\d{2}|\d{4}\/\d{2}\/\d{2})/;
      const str = '2023-03-13';
      const str1 = '2023-06/13';
      console.log(reg.test(str)); // true
      console.log(reg.test(str1)); // false

很不错的想法,但是如果格式变多,表示式也会变得非常冗余。如果我们用反向引用,把后面的符号变成前面的引用就能保持一致了。

   const reg = /\d{4}(-|\/)\d{2}\1\d{2}/;

上述中\1就是对前面括号内分组的引用,这里不是表示数字,表示的就是前面分组匹配到的子表达式。而数组表示第几个分组,\1就表示第一个分组,\2就是表示的第二个分组,依此类推。

    const reg = /\d{1}(-|\\)\d{1}(\.|\*)\d{1}\2\d{1}/;
    const str = '1-2.3.4';
    const str1 = '1-2.3*4';
    console.log(reg.test(str)); // true
    console.log(reg.test(str1)); //false

\2就表示的就是第二个分组点或者星符号。

总结

以上就是反向引用,我们要记住用法+分组序号,灵活使用反向引用,能够简化我们的正则表达式,也方便后期的维护。