如何将match/matchAll返回的匹配分组转换为可按下标访问的数组?
解决方案
你可以直接用Array.from将matchAll返回的IterableIterator转换为数组,你之前无法获取分组是因为转换后的数组每一项对应一次完整匹配结果,分组值存储在对应匹配结果的子项中,同时建议修正正则中的.未转义的问题。
最简一行实现(TS兼容)
function convertVersionToNumber(line: string): number { return parseInt(Array.from(line.matchAll(/^# ([0-9])\.([0-9]{2})\.([0-9]{2})\s*/g))[0].slice(1, 4).join('')); }
更优化的实现(无需使用matchAll)
由于你的正则是匹配行头,只会触发一次匹配,完全可以去掉全局修饰符g直接使用match方法,无需处理迭代器,代码更简洁:
function convertVersionToNumber(line: string): number { // 可选链兼容匹配失败场景,避免运行时报错 return parseInt(line.match(/^# ([0-9])\.([0-9]{2})\.([0-9]{2})\s*/)?.slice(1, 4).join('') || '0'); }
迭代器跳过第一个元素的简洁写法
如果后续需要处理迭代器并跳过第一个元素,直接用数组解构即可实现:
// 解构时第一个位置留空即可跳过首个元素 const [, ...restItems] = Array.from(yourIterableIterator);
内容的提问来源于stack exchange,提问作者Daniel Kaplan
相关产品推荐
相关产品推荐

