2017-03-07 88 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"等,並似乎工作。