2016-11-21 6 views
1
private const string NUMERIC_REGEX = "\\W*([0-9]+)(\\W)?([0-9]*)\\W*" 

私が取り組んでいるプロジェクトでこの正規表現が使用されていました。通貨を含む文字列から数値を解析すると仮定します。 => 14.22この正規表現より優れた代替方法をお勧めしますか?

"14.22€" のよう

しかし、これをサポートしていないようです。誰かが特別な通貨記号で動作するようにそれを適応させるのに役立つことができますか?

代わりに、この([\d,.]+)が私の必要なところでうまく動作することがわかりましたが、私が特別なケースを逃しているのかどうかは分かりません。

+0

通貨記号はスペースの有無にかかわらず左右に移動できます –

+0

['\ p {Sc} * \ s *([0-9] * \。?[0-9 ] +)\ s * \ p {Sc} * '](http://regexstorm.net/tester?p=%5cp%7bSc%7d*%5cs*%28%5b0-9%5d*%5c.% '\ p {Sc}'が通貨記号と一致する場合、3f%5b0-9%5d%2b%29%5cs *%5cp%7bSc%7d *&i = Like +%2214.22 +%e2%82%ac%22) \ s * \ p {Sc} * \ s *([0-9] * \。?[0-9] +)\ s * \ p {Sc} * "; –

答えて

2

良い答えは、正規表現を使用することです:

(?:\p{Sc} ?)?([\d,.]+)(?: ?\p{Sc})? 

Regex Proof

この正規表現はあなたが使っていた正規表現の拡張バージョンです。 あなたの番号の後にANDの前にオプションの通貨記号があるかどうかチェックします。

hereとオプションのスペースがあるため、通貨記号のマッチングは\ p {Sc}です。

この正規表現は、キャプチャしていないグループの通貨記号をチェックします。つまり、キャプチャグループ1があなたの番号になります。

詳細については、この回答のRegex Proofリンクをクリックしてください。

2

既存のクラスを使用したいかどうかわかりませんが、System.Data.SqlTypes.SqlMoneyを試してみるとよいでしょう。これは、文字列が正規表現によって解析されないことを確認します。たぶん

SqlMoney money = SqlMoney.Parse("12,03 €"); 
decimal number = money.Value; 
0

このような何か:これは失敗する可能性があります...

使用は次のようになるでしょうか? :

const string PATTERN = @"^(?'num'\d{0,}[\.|,]{0,1}\d{0,})"; 

online regex

あなたはこのように使用することができますあなたの質問に

match = regex.Match(meInput); 
string numStr = match.Groups["num"].Value; 
double num = double.Parse(numStr); 
関連する問題