前言
上节提到过同样的符号在不同位置含义不同,本节学习的惰性匹配就诠释了这句话,下面我们一起来看一下惰性匹配。
惰性匹配
惰性匹配简单来说就是尽可能的去匹配最小的量词。正则中直接使用量词就是贪婪匹配,而如果加上?号就是惰性匹配:
- 贪婪匹配:贪婪就是要多要,在匹配的时候就会尽可能多匹配,朝着最大的量词去做匹配,{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"...]
很明显当我们把匹配字符顺序变一下会匹配结果完全不一样,这就是分支的惰性匹配,当最左边的字符符号条件时,就不会再继续往下面匹配了。
总结
当我们用正则匹配字符时,就是量词、字符组、多选之间的使用组合,多加练习记牢这些规则,那么正则对于我们来说就会变得简单。