2012-04-17 2 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]*";도 있기 때문에 * 정량의 영 문자와 일치하는 것입니다 : 당신이 LINQ extension methods을 사용할 수 /하고자하는 경우 OU도이 방법을 단축 할 수 있습니다.

만 문자열의 편지가 있는지 확인하려면

, 단지

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

를 사용하지만, 물론 이것은 단지 ASCII 문자와 일치한다. 더 나은 방법은 재산 "편지"와 유니 코드 코드 포인트를 일치 유니 코드 속성

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} 사용해야합니다 단지 숫자에 대한 확인하려면 다음 표의 문자의 서체를 제외한 모든 스크립트에서 구를 통해 숫자 제로.

유니 코드 속성에 대한 자세한 내용은 www.regular-expressions.info/unicode을 참조하십시오.

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

다음은, \P{Nd}에만 패턴을 변경해야 \p{Nd}의 부정이며, 경우에 일치 :이 "없는 숫자"입력에이 경우

다음 대안은 확인하는 것입니다 입력에 하나의 비 숫자가 있습니다.

+0

''^ [0-9] + $ "'(내 RegEx가 좋지는 않지만 그래도 문제가되지는 않을지라도) 문자를 찾기보다는 모든 숫자를 검사하는 것이 전체적으로 선호 될 수도 있습니다. – musefan

+0

@musefan 자리 대체에 대한 검사와 함께. – stema

4

나는 그래서 여기에 당신은 항상 시도 할 수있는 대안 ...

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

    return true; 
} 

다음과 같이이를 사용할 수 있습니다 ...

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

이며, 정규식 남용의 팬이 아니다 .. 아래 댓글을 통해 엘리 갈릴리 Arbel 감사와


, y)에, 당신은 정규식을 원하는 .of 물론 경우에 나는 누군가가 곧 당신을 정렬합니다 확신합니다

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

관련 문제