2011-01-09 11 views
2

私は、次の正規表現を使用して数字の任意の数や小数点を含むことができ、文字列にマッチしようとしています:Regex.IsMatchは、そうしてはならないときにtrueを返します。

([0-9.])* 

ここで正規表現をテストするために、いくつかのC#コードです:

Regex regex = new Regex("([0-9.])*"); 

if (!regex.IsMatch("a")) 
    throw new Exception("No match."); 

私はここに例外がスローされることを期待していますが、私はRegexを間違って使用しているのですか、パターンにエラーがありますか?

編集:空白の文字列にも一致したいと思います。

+1

小数点をエスケープしてみてください。私はRegExがそれを「あらゆる性格」であると理解していると思います。 –

答えて

9

*数量詞は、 "一致0以上" を意味します。あなたのケースでは、 "a"は0のマッチを返すので、正規表現は引き続き成功します。おそらくたかった:

([0-9.]+) 

それは非数値の入力に失敗し、マッチを返さないよう+数量詞は、「マッチ1以上を意味し、迅速スピンregex testerショー:。

input  result 
-----  ------ 
[empty] No matches 
a   No matches 
.   1 match: "." 
20.15  1 match: "20.15" 
1   1 match: "1" 
1.1.1  1 match: "1.1.1" 
20.  1 match: "20." 

は、のように見えます我々はいくつかの偽陽性を持っている、のような正規表現を修正してみましょう:

^([0-9]+(?:\.[0-9]+)?)$ 

は今我々が得る:

input  result 
-----  ------ 
[empty] No matches 
a   No matches 
.   No matches 
20.15  1 match: "20.15" 
1   1 match: "1" 
1.1.1  No matches: "1.1.1" 
20.  No matches 

涼しさ。

+0

ありがとうございました*ほぼ* - ありがとうございます!私の意図が「ゼロ以上」というのは、私も空の文字列を受け入れたいということでした。あなたが提案した正規表現にそれを追加する方法はありますか? –

+2

@James Cadd:はい。 '^((?:[0-9] +(?:\。[0-9] +)?)| \ s *)$'しかし、正規表現を単純にするためには、おそらく 'str ==" "|| IsMatch(...) '。 – Juliet

+1

ああ、最後に考えたことは、できるだけ正規表現を避けるべきです。グローバリゼーションのような、あなたの正規表現では考えられないニュアンスはほとんどありません。 '.'は普遍的な小数点の区切りではなく、現在の形式の正規表現は1000sの区切りを考慮していません。可能であれば、 'decimal.TryParse'の使用を検討してください。 – Juliet

6

あなたはこれが正常に動作する必要があります+の代わりに、*

Regex reg = new Regex("([0-9.])+"); 

を使用する必要があります。

*を使用すると、任意の文字列がこのパターンと一致することがあります。

6
Regex.IsMatch("a", "([0-9.])*") // true 

グループはZERO回以上に一致することができるからです。

Regex.IsMatch("a", "([0-9.])+") // false 
+0

これは実際には正解です。ジュリエットが指摘したように、文字クラスでは。リテラルとして扱われます – Rob

関連する問題