2009-07-25 2 views
146

у меня есть входная строка, и я хочу, чтобы убедиться, что он содержит:Проверка, что строка содержит только буквы в C#

  • только буквы или
  • только букву и цифру или
  • только буквы, цифры или подчеркивание

Чтобы уточнить, у меня есть 3 разных случая в коде, каждый из которых требует различной проверки. Каков самый простой способ достичь этого в C#?

ответ

223

только буквы:

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

только буквы и цифры:

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

только буквы, цифры и символ подчеркивания:

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

Это предполагает латинский алфавит, где Char.IsLetter позволяет для нелатинских алфавитов. –

+5

Regex.IsMatch (input, "^ [a-z0-9] + $", RegexOptions.IgnoreCase); –

+3

@TomFobear: это медленнее, чем явно задание [a-zA-Z] –

3

Вы можете цикл на гольцах струны и проверить с помощью метода Char IsLetter , но вы также можете сделать трюк с использованием методы Струнного IndexOfAny искать другой Charaters, которые не предполагает, чтобы быть в строке.

1

перебирать струны символов и функций использования «Char 'называется' IsLetter 'и' IsDigit '.

Если вам нужно что-то более конкретное - используйте класс Regex.

7

Я думаю, что это хороший случай использовать регулярные выражения:

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 имеет статические методы для этого –

+0

Ничего, я не помнил его, нет VS на руке ... редактирование ... – CMS

42

Letters только:

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

букв и цифр:

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

буквы, цифры и подчеркивания:

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

Примечание. Эти шаблоны также соответствуют международным символам (в отличие от использования конструкции 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

Мне было бы интересно узнать, какая из них быстрее ваша (LINQ) или от Филиппа Лейбаерт (Regex)? – nam

17

Для тех из вас, кто предпочел бы не ходить с регулярным выражением и находится на .NET 2.0 Framework (AKA нет LINQ):

Только Письма:

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

только цифры:

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

только цифры или буквы:

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

только цифры или буквы подчеркиваний:

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

Если Вы новичок, то вы можете взять ссылку из моего кода .. что я сделал, чтобы положить на чеке, так что я мог получить только алфавиты и пробелы! Вы можете повторить цикл после того, как второй, если заявление для проверки строки снова

 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(); 
     } 
Смежные вопросы