我正在尝试匹配一个货币字符串,该字符串可能会或可能不会以K,M或Bn之一为后缀,并将它们分为两部分
有效匹配:
500 K // Expected grouping: ["500", "K"]
900,000 // ["900,000", ""]
2.3 Bn // ["2.3", "Bn"]
800M // ["800", "M"]
ps:我知道匹配输出数组中匹配的第一项是整个匹配字符串,上面的预期分组只是一个例子
我到目前为止所使用的正则表达式是:
/\b([-\d\,\.]+)\s?([M|Bn|K]?)\b/i
当我将它与普通字符串匹配时,它就可以了。
"898734 K".match(/\b([-\d\,\.]+)\s?([M|Bn|K]?)\b/i)
=> ["898734 K", "898734", "K"] // output
"500,000".match(/\b([-\d\,\.]+)\s?([M|Bn|K]?)\b/i)
=> ["500,000", "500,000", ""]
麻烦的是,它也匹配那里的空间
"89 8734 K".match(/\b([-\d\,\.]+)\s?([M|Bn|K]?)\b/i)
=> ["89 ", "89", ""]
我不确定为什么。所以我想我会在那里添加/g
选项以匹配整个字符串,但现在它不会对匹配进行分组。
"898734 K".match(/\b([-\d\,\.]+)\s?([M|Bn|K]?)\b/gi)
=> ["898734 K"]
我需要做出哪些改变才能使正则表达式按预期运行?
答案 0 :(得分:1)
你可以使用不同的正则表达式,它可以查找一些数字,逗号或点以及其他一些数字,一些whitepspace和想要的字母。
var array = ['500 K', '900,000', '2.3 Bn', '800M'],
regex = /(\d+[.,]?\d*)\s*(K|Bn|M|$)/
array.forEach(function (a) {
var m = a.match(regex);
if (m) {
m.shift();
console.log(m);
}
});
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
您遇到问题,并希望使用正则表达式来解决问题。现在你有两个问题......
开玩笑说,我认为你可以在没有任何正则表达式的情况下实现你想做的事情:
"".join([c for i, c in enumerate(itertools.takewhile(lambda c: c.isdigit() or c in ',.', s))]), s[i+1:]
我使用s="560 K"
,s="900,000"
等尝试了此操作,似乎有效。