正则学习(三)——惰性与多选

145 阅读2分钟

前言

上节提到过同样的符号在不同位置含义不同,本节学习的惰性匹配就诠释了这句话,下面我们一起来看一下惰性匹配。

惰性匹配

惰性匹配简单来说就是尽可能的去匹配最小的量词。正则中直接使用量词就是贪婪匹配,而如果加上?号就是惰性匹配:

  • 贪婪匹配:贪婪就是要多要,在匹配的时候就会尽可能多匹配,朝着最大的量词去做匹配,{1,2}会先按照两次的标准去匹配。
   const str = '1 12 123'
   const reg = /\d{1,2}/g
   //只要满足就匹配出来
   console.log(str.match(reg))// ['1', '12', '12', '3']
  • 惰性匹配:惰性匹配匹配到最少次数就不会往下继续匹配,比如{1,2}?就会匹配一次。
    const reg = /\d{1,2}?/g
    console.log(str.match(reg))// ['1', '1', '2', '1', '2', '3']

对比上面两个例子,我们能清晰地看到,加了惰性匹配,量词匹配时就会用最小的量词去匹配。我们提到过?在表示量词时是{0,1}的简写,所以?后面也能跟?:

   const str = '1';
   const reg = /\d??/g;
   console.log(str.match(reg)); //  ['', '']

所以不同位置符号含义我们要清楚,不然可能会一脸懵。

多选

当我们有多种情况需要匹配时,可以用多选分支,每一个分支都是一个子模式,子模式之间用|分隔开来,也就是多种情况的集合。

   const str = 'a b c';
   const reg = /(a|b)/g;
   console.log(str.match(reg)); //  ['a', 'b']

注意多选情况下的匹配是惰性匹配,优先匹配左边的字符。。

   const reg = /(ab|abc)/;
   const reg1 = /(abc|ab)/
   const str = 'abc';
   console.log(str.match(reg)) // ["ab"...]
   console.log(str.match(reg1)) // ["abc"...]

很明显当我们把匹配字符顺序变一下会匹配结果完全不一样,这就是分支的惰性匹配,当最左边的字符符号条件时,就不会再继续往下面匹配了。

总结

当我们用正则匹配字符时,就是量词、字符组、多选之间的使用组合,多加练习记牢这些规则,那么正则对于我们来说就会变得简单。