我们说我跑这个
var text = "abc def ghi";
var regex = /a(bc)|d(e)f|(gh)i/g
while (match = regex.exec(text)) {
console.log(match);
}
// 0=abc, 1=bc, 2=undefined, 3=undefined
// 0=def, 1=undefined, 2=e, 3=undefined
// 0=ghi, 1=undefined, 2=undefined, 3=gh
在循环的每次迭代中,我都想检索匹配的捕获组,所以只有bc,e,gh。是否可以不手动检查未定义?
答案 0 :(得分:0)
我认为你不能避免检查(除非你可以使用Wiktor pointed out的外观,但它不需要啰嗦:
var text = "abc def ghi";
var regex = /a(bc)|d(e)f|(gh)i/g
while (match = regex.exec(text)) {
var first = match.reduce((p, entry, i) => p && i != 1 ? p : entry);
console.log(first);
}
请注意,忽略所有虚假值,因为您的捕获组根本不匹配(给您undefined
)或匹配非空字符串,因此我们不必担心{{1 }}
或者,而不是
""
你可以使用
var first = match.reduce((p, entry, i) => p && i != 1 ? p : entry);
...但它涉及一个临时数组。
答案 1 :(得分:0)
您将在match
中获得数组,因此您还可以添加一个逻辑,从最后遍历数组并获取第一个不是undefined
的值。如下所示:
var text = "abc def ghi";
var regex = /a(bc)|d(e)f|(gh)i/g;
var finalMatch = [];
var match;
while (match = regex.exec(text)) {
for(var i=match.length; i>0; i--){
if(match[i]){
finalMatch.push(match[i]);
break;
}
}
}
console.log(finalMatch);