2012-04-17 5 views
0

私はC#と を学習しています。コンソールにアルファベット文字ではなく入力として数字を受け取る小さなテストプログラムがあります。Regexオブジェクト照合で指定された文字列パターンで照会します

string inputString; 

     string pattern = "[A-Za-z]*"; 
     Regex re = new Regex(pattern); 

     inputString = Console.ReadLine(); 

     while(re.Match(inputString).Success) 
     { 
      Console.WriteLine("Please stick to numerals"); 
      inputString = Console.ReadLine(); 
     } 
     Console.WriteLine(inputString); 

問題は、アルファベット文字や数字を区別しませんコンパイラです。

おそらく何か提案があります コードが正しいようです。

答えて

2

問題はstring pattern = "[A-Za-z]*";もあるため*量指定子の0文字にマッチするということです:あなたはLINQ extension methodsを使用することができ/喜んでいる場合のouも、このメソッドを短縮することができます。

あなただけの文字列に文字があるかどうかを確認したい場合は

、ちょうど

string pattern = "[A-Za-z]"; 

を使用しますが、もちろん、これはのみASCII文字に一致しています。より良いアプローチは、プロパティ「手紙」で任意のUnicodeコードポイントと一致しますUnicodeプロパティ

string pattern = @"\p{L}"; 

\p{L}を使用することです。

注:

私はあなたが入力中の文字がある場合、これは、数字だけのためにそのチェックをチェックしていないことを認識している願っています。もちろん、これは文字ではなく数字ではない文字を受け入れます!

あなたは数字だけためチェックしたい場合は、@ musefanの答えのために行くか、このよう

string inputString; 

string pattern = @"^\p{Nd}+$"; 
Regex re = new Regex(pattern); 

inputString = Console.ReadLine(); 

while (!re.Match(inputString).Success) { 
    Console.WriteLine("Please stick to numerals"); 
    inputString = Console.ReadLine(); 
} 
Console.WriteLine(inputString); 

\p{Nd}または\p{Decimal_Digit_Number}正規表現を使用する必要があります。表意文字以外の任意のスクリプトで9を通して数字のゼロ。

ユニコードプロパティの詳細については、www.regular-expressions.info/unicodeを参照してください。

「数字ではなく、」入力中がある場合、次の代替はチェックすることです:

string pattern = @"\P{Nd}"; 
... 
while (re.Match(inputString).Success) { 

あなただけのパターンを変更する必要があるザ・、\P{Nd}\p{Nd}の否定であるとあればマッチします入力に1つの非数字があります。

+0

''^[0-9] + $ "'(私のRegExは大したものではありませんが、これは間違っている可能性があります) – musefan

+0

@musefan私の回答を更新しました代わりに数字のチェックをします。 – stema

4

私は...次のようにあなたがこれを使用することができます...あなたがいつも試みることができる代替であるので、ここでは、

while(!IsNumeric(inputString)) 
{ 
    Console.WriteLine("Please stick to numerals"); 
    inputString = Console.ReadLine(); 
} 

public bool IsNumeric(string input) 
{ 
    foreach(char c in input) 
    { 
     if(!char.IsDigit(c)) 
     { 
      return false; 
     } 
    } 

    return true; 
} 

正規表現の乱用のファンではありません..あなたが正規表現をしたい場合.ofもちろん私は誰かがすぐにあなたを整理確信しています。)以下のコメントを経由イーライArbelのおかげで


、Y

public bool IsNumeric(string input) 
{ 
    return input.All(x => char.IsDigit(x)); 
} 
+1

+1私は単純にinput.All(c => char.IsDigit(c))を使用していますが、 –

+0

@EliArbel:前回は '.All'を使用していませんでした。あなたのコメント – musefan

+0

+1を代替ソリューションに反映させるため、私の質問にもう少し情報を追加しました。ラムダ式では、すべての文字をループするよりもはるかによく見えます。 – stema

関連する問題