前言
前面我们介绍括号的分组引用与反向引用,都专门保存了匹配到的数据,以便我们后续去使用,正则中称为捕获分组。根据我们的经验有捕获型就会有非捕获型,下面来介绍下非捕获型分组。
非捕获
非捕获也就是意味着匹配到的数据不会被保存,括号的引用作用不会再生效,就单单是一个分组的作用。非捕获括号就是在分组前加?:,比如(?:a|b)。
const reg = /(a|b)/;
const reg1 = /(?:a|b)/;
const str = 'abc';
console.log(str.match(reg));
console.log(str.match(reg1));
很明显当我们加上了?:,用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"
+符号表示至少出现一次。
总结
非捕获分组就是在括号里加上?:,括号的主要作用还是分组,灵活使用分组,写出方便好用的正则。