2017-03-07 86 views
2

我想匹配的货币字符串,可能会或可能不会与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 89 8734 K“'应该是什么结果? – RomanPerekhrest

+0

@RomanPerekhrest - 没有匹配会是理想的 – LocustHorde

+0

你正在使用字边界(\ b),因为这发生与其他文本混合?或者是孤立的线? – alebianco

回答

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; }

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"等,并似乎工作。