Проверка того, что строка содержит только буквы в C #


187

У меня есть входная строка, и я хочу убедиться, что она содержит:

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

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

Ответы:


292

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

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

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

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

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

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

31
Это предполагает использование латинского алфавита, где Char.IsLetter допускает использование нелатинских алфавитов.
Пол ван Бренк

5
Regex.IsMatch (input, "^ [a-z0-9] + $", RegexOptions.IgnoreCase);
Том Фобер,

4
@TomFobear: это медленнее, чем явное указание [a-zA-Z]
Филипп Лейберт

25
Просто чтобы спасти людей вроде меня от еще одного поиска, Regex находится в пространстве имен System.Text.RegularExpressions
Эрик Барр,

Ответ, предоставленный Мухаммедом Хасаном Ханом ниже, также заслуживает рассмотрения. Сравнение текста в RegEx происходит медленно.
двуногая лошадь

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

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

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

5
Мне было бы интересно узнать, какой из них быстрее (LINQ) или тот, что от Филиппа Лейберта (Regex)?
Нам

5
@nam Запуск теста по словарю произношения CMU (только все буквы, средняя длина 7,4 символа), это в 1,8 Regexраза быстрее, чем скомпилировано Regexдля всех букв , и в 3 раза быстрее, чем скомпилировано для всех букв с IgnoreCaseпараметром (!).
NetMage

1
В принятом ответе используется не скомпилированное регулярное выражение, которое будет еще медленнее. Я предпочитаю решение LINQ, спасибо за размещение :)
Беренд Энгельбрехт

48

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

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

Буквы и цифры:

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

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

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

Обратите внимание, что эти шаблоны также соответствуют международным символам (в отличие от использования a-zконструкции).


19

Для тех из вас, кто предпочел бы не использовать Regex и использовать .NET 2.0 Framework (AKA no 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;
    }

8

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

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 есть статические методы для этого
Филипп Лейберт

4

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


1

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

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


1

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

       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;
               break;
           }

       }

       if (check==false)
       {
           Console.WriteLine("Enter Valid Value");
           name = Console.ReadLine();
       }

0

Недавно я сделал улучшения производительности для функции, которая проверяет буквы в строке с помощью этой страницы.

Я понял, что решения с регулярным выражением в 30 раз медленнее, чем решения с проверкой Char.IsLetterOrDigit.

Мы не были уверены, что эти буквы или цифры включают в себя, и нам были нужны только латинские символы, поэтому мы реализовали нашу функцию на основе декомпилированной версии функции Char.IsLetterOrDigit.

Вот наше решение:

internal static bool CheckAllowedChars(char uc)
    {
        switch (uc)
        {
            case '-':
            case '.':
            case 'A':
            case 'B':
            case 'C':
            case 'D':
            case 'E':
            case 'F':
            case 'G':
            case 'H':
            case 'I':
            case 'J':
            case 'K':
            case 'L':
            case 'M':
            case 'N':
            case 'O':
            case 'P':
            case 'Q':
            case 'R':
            case 'S':
            case 'T':
            case 'U':
            case 'V':
            case 'W':
            case 'X':
            case 'Y':
            case 'Z':
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                return true;
            default:
                return false;
        }
    }

И использование так:

 if( logicalId.All(c => CheckAllowedChars(c)))
 { // Do your stuff here.. }

0

Пожалуйста, найдите способ проверить, является ли символ буквой, цифрой или пробелом, в противном случае добавьте подчеркивание (будьте свободны для изменения в соответствии с вашими потребностями)

public String CleanStringToLettersNumbers(String data)
{
    var result = String.Empty;

    foreach (var item in data)
    {
        var c = '_';

        if ((int)item >= 97 && (int)item <= 122 ||
            (int)item >= 65 && (int)item <= 90 ||
            (int)item >= 48 && (int)item <= 57 ||
            (int)item == 32)
        {
            c = item;
        }

        result = result + c;
    }

    return result;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.