正则学习(九)——捕获与非捕获

255 阅读2分钟

前言

前面我们介绍括号的分组引用与反向引用,都专门保存了匹配到的数据,以便我们后续去使用,正则中称为捕获分组。根据我们的经验有捕获型就会有非捕获型,下面来介绍下非捕获型分组。

非捕获

非捕获也就是意味着匹配到的数据不会被保存,括号的引用作用不会再生效,就单单是一个分组的作用。非捕获括号就是在分组前加?:,比如(?:a|b)。

      const reg = /(a|b)/;
      const reg1 = /(?:a|b)/;
      const str = 'abc';
      console.log(str.match(reg)); 
      console.log(str.match(reg1)); 

image.png 很明显当我们加上了?:,用match返回的结果中就没有匹配到的数据,这就是捕获与非捕获分组。

案例

括号的作用我们也讲解了好几节,它的作用有很多分组、引用、反向引用等,下面我们就来看两道小案例巩固一下,也是经典的面试题。

  • 单词首字母大写,比如‘abc d’变为‘Abc D’。这道题难度在于,每个单词都得大写,如果不用正则出来会复杂。单词与单词之间有着空格,所以我们要用匹配位置,用?:\s去匹配空格后的字母,注意开头也需要匹配,然后直接用replace替换词大写单词即可。
      const reg = /(?:\s|^)[a-zA-z]/g;
      const str = 'how are you';
      const str1 = str.replace(reg, (s) => {
        return s.toUpperCase();
      });
      console.log(str1); //How Are You
  • 手写trim方法,trim方法可以去除首尾的空格,知道了trim方法的效果,思路就非常明确,用正则去匹配开头、结尾的空格,然后replace空字符。
       const reg = /(^\s+|\s+$)/g;
      const str = '  111  ';
      console.log(str.replace(reg, '')); //"111"

+符号表示至少出现一次。

总结

非捕获分组就是在括号里加上?:,括号的主要作用还是分组,灵活使用分组,写出方便好用的正则。