2009-07-25 35 views
146

Tôi có một chuỗi đầu vào và tôi muốn xác minh rằng nó chứa:Thẩm định rằng một chuỗi chỉ chứa ký tự trong C#

  • Chỉ có chữ cái hoặc
  • Chỉ chữ và số hoặc
  • Chỉ chữ cái, số hoặc gạch dưới

Để làm rõ, tôi có 3 trường hợp khác nhau trong mã, mỗi trường hợp yêu cầu xác thực khác nhau. Cách đơn giản nhất để đạt được điều này trong C# là gì?

Trả lời

223

Chỉ có chữ cái:

Regex.IsMatch(input, @"^[a-zA-Z]+$"); 

Chỉ có chữ cái và con số:

Regex.IsMatch(input, @"^[a-zA-Z0-9]+$"); 

Chỉ có chữ cái, số và gạch:

Regex.IsMatch(input, @"^[a-zA-Z0-9_]+$"); 
+24

Điều này giả định bảng chữ cái Latinh, nơi Char.IsLetter cho phép bảng chữ cái không phải latin. –

+5

Regex.IsMatch (đầu vào, "^ [a-z0-9] + $", RegexOptions.IgnoreCase); –

+3

@TomFobear: đây là chậm hơn rõ ràng chỉ định [a-zA-Z] –

3

Bạn có thể lặp lại các ký tự chuỗi và kiểm tra bằng cách sử dụng phương thức Char IsLetter nhưng bạn cũng có thể thực hiện một mẹo bằng cách sử dụng phương thức String IndexOfAny để tìm kiếm các ký tự khác không giả sử trong chuỗi.

1

Duyệt qua chuỗi ký tự và chức năng sử dụng 'Char 'được gọi là' IsLetter 'và' IsDigit '.

Nếu bạn cần một cái gì đó cụ thể hơn - hãy sử dụng lớp Regex.

7

tôi nghĩ là một trường hợp tốt để sử dụng Regular Expressions:

public bool IsAlpha(string input) 
{ 
    return Regex.IsMatch(input, "^[a-zA-Z]+$"); 
} 

public bool IsAlphaNumeric(string input) 
{ 
    return Regex.IsMatch(input, "^[a-zA-Z0-9]+$"); 
} 

public bool IsAlphaNumericWithUnderscore(string input) 
{ 
    return Regex.IsMatch(input, "^[a-zA-Z0-9_]+$"); 
} 
+2

Regex có phương pháp tĩnh cho điều này –

+0

Tốt đẹp, tôi không nhớ nó, không có VS trên tay ... chỉnh sửa ... – CMS

42

Letters chỉ:

Regex.IsMatch(theString, @"^[\p{L}]+$"); 

chữ cái và số:

Regex.IsMatch(theString, @"^[\p{L}\p{N}]+$"); 

Letters, số và gạch:

Regex.IsMatch(theString, @"^[\w]+$"); 

Lưu ý, các mẫu này cũng khớp với các ký tự quốc tế (trái ngược với việc sử dụng cấu trúc a-z).

191
bool result = input.All(Char.IsLetter); 

bool result = input.All(Char.IsLetterOrDigit); 

bool result = input.All(c=>Char.IsLetterOrDigit(c) || c=='_'); 
+3

Tôi rất tò mò muốn biết cái nào nhanh hơn của bạn (LINQ) hoặc từ Philippe Leybaert (Regex)? – nam

17

Đối với những người bạn không muốn đi cùng Regex và đang ở trên .NET 2.0 Framework (AKA không LINQ):

Chỉ Letters:

public static bool IsAllLetters(string s) 
{ 
    foreach (char c in s) 
    { 
     if (!Char.IsLetter(c)) 
      return false; 
    } 
    return true; 
} 

Chỉ số:

public static bool IsAllDigits(string s) 
    { 
     foreach (char c in s) 
     { 
      if (!Char.IsDigit(c)) 
       return false; 
     } 
     return true; 
    } 

Chỉ số hoặc chữ:

public static bool IsAllLettersOrDigits(string s) 
    { 
     foreach (char c in s) 
     { 
      if (!Char.IsLetterOrDigit(c)) 
       return false; 
     } 
     return true; 
    } 
.210

Chỉ số hoặc chữ hoặc dấu gạch dưới:

public static bool IsAllLettersOrDigitsOrUnderscores(string s) 
    { 
     foreach (char c in s) 
     { 
      if (!Char.IsLetterOrDigit(c) && c != '_') 
       return false; 
     } 
     return true; 
    } 
1

Nếu bạn là một newbie thì bạn có thể tham khảo thông tin từ mã của tôi .. những gì tôi đã làm là để đặt trên một tấm séc để tôi chỉ có thể nhận được các bảng chữ cái và không gian màu trắng! Bạn có thể lặp lại vòng lặp for sau câu lệnh if thứ hai để xác thực lại chuỗi

 bool check = false; 

     Console.WriteLine("Please Enter the Name"); 
     name=Console.ReadLine(); 

     for (int i = 0; i < name.Length; i++) 
     { 
      if (name[i]>='a' && name[i]<='z' || name[i]==' ') 
      { 
       check = true; 
      } 
      else 
      { 
       check = false; 
      } 

     } 

     if (check==false) 
     { 
      Console.WriteLine("Enter Valid Value"); 
      name = Console.ReadLine(); 
     } 
Các vấn đề liên quan