javascript中的match()返回带有空字符串的数组

时间:2017-01-13 06:56:50

标签: javascript regex

我需要检测货币并从这些字符串中提取数字" 10美元","美元10"等我使用String.prototype.match()和regex

/((dollar|usd\$)\s*(\d+)|(\d+)\s*(dollar|usd\$))/i

但是匹配()会让我回归" 10美元"

["10 dollar", "10 dollar", undefined, undefined, "10", "dollar"]

和" 10美元"

["dollar 10", "dollar 10", "dollar", "10", undefined, undefined]

如何避免这种情况并获得可预测的数字位置?

2 个答案:

答案 0 :(得分:2)

您可以检查匹配的组,然后获取必要的值。

我建议通过将交替变为非捕获组并删除外部组来简化结构:

/(?:dollars?|usd\$)\s*(\d+)|(\d+)\s*(?:dollars?|usd\$)/i

请参阅this demo

演示测试:

var re = /(?:dollars?|usd\$)\s*(\d+)|(\d+)\s*(?:dollars?|usd\$)/i;
var strs = ["10 dollars", "dollars 30"];
for(var t of strs) {
  var m = t.match(re);
  if (m && m[2]) 
    console.log(m[2]);
  else if (m) console.log(m[1]);
 
}

答案 1 :(得分:1)

您可以通过在左侧填充后添加(parentheses)将正则表达式中的任何组(?:中的内容)标记为“非捕获”,如(?:non|capturing|group)中所示。

因此,如果您想要的只是数字,而不是“美元”或“美元”这个词,您可以这样做:

/(?:(?:dollar|usd\$)\s*(\d+)|(\d+)\s*(?:dollar|usd\$))/i

这会给你["dollar 10", undefined, "10"]“10美元”。从那里开始吧:

var matches = myString.match(/(?:(?:dollar|usd\$)\s*(\d+)|(\d+)\s*(?:dollar|usd\$))/i);    
var amount = matches[2] || matches[1];