正如标题所示,我厂有这么一个需求。我不会,老板鄙视我后丢过来一个链接:stackoverflow: Count the capture groups in a qr regex?
看不太懂 Perl,但是这个思路很棒。所以改写成 JS 版,并记录如下:
function countCapturingGroups(r){
r = new RegExp(`|${r.source}`);
const result = ''.match(r);
return result.length - 1;
}
const result = countCapturingGroups(/fo(.)b(..)/);
console.log(result); // 2
它的原理是这样的。构建一个新正则,包含两部分:空字符和目标正则。空字符正则会完成与目标字符串的匹配,保证有结果(不然的话就会返回 null
。接下来 |
会保证后面的正则也是有效的,可以生成包含子表达式结果的数组。
我们知道,结果是个类数组,结构大约是:
- 全部匹配字符串
- 0~N 子表达式结果
- 其它一些属性
所以用其长度 – 1 就能获得子表达式的个数。从功耗上来说,这个应该是很节省了。
欢迎吐槽,共同进步