取第一个非空的regex.exec()捕获组

时间:2018-05-05 10:36:19

标签: javascript regex

我们说我跑这个

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。是否可以不手动检查未定义?

2 个答案:

答案 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);