2017-01-13 2 views
0

"10ドル"や "ドル10"などの文字列から通貨を検出して数字を抽出する必要があります。String.prototype.match()と正規表現を使用しますjavascriptのmatch()はヌル文字列で配列を返します

/((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

どのグループが一致しているかを確認することができます。 –

+0

スーパーシンプル '/(\ d +)\(ドル| usd)|(ドル| usd)\(\ d +)/ gi' –

答えて

1

(?:non|capturing|group)のように、左側の括弧の後ろに?:を追加することで、正規表現の任意のグループ((parentheses)のもの)を「非キャプチャ」としてマークすることができます。

だから、あなたが望むすべては数字ではなく、単語「ドル」または「USD」であれば、あなたが行うことができます:あなたは「10ドル」の["dollar 10", undefined, "10"]を与える

/(?:(?:dollar|usd\$)\s*(\d+)|(\d+)\s*(?:dollar|usd\$))/i 

を。そこから、次のようにしてください:

var matches = myString.match(/(?:(?:dollar|usd\$)\s*(\d+)|(\d+)\s*(?:dollar|usd\$))/i);  
var amount = matches[2] || matches[1]; 
2

どのグループが一致しているかを確認し、必要な値を取得できます。

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

/(?:dollars?|usd\$)\s*(\d+)|(\d+)\s*(?:dollars?|usd\$)/i 

this demo

デモ試験を見る

Iは少し外側のグループを非捕捉グループに交互に回転し、除去することにより、構造を簡素化することをお勧め

関連する問題