正则表达式匹配整个字符串

时间:2017-03-07 10:29:54

标签: javascript

我正在尝试匹配一个货币字符串,该字符串可能会或可能不会以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"]

我需要做出哪些改变才能使正则表达式按预期运行?

2 个答案:

答案 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"等尝试了此操作,似乎有效。