我需要检测货币并从这些字符串中提取数字" 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]
如何避免这种情况并获得可预测的数字位置?
答案 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];