Перевірка того, що рядок містить лише літери в 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 (вхід, "^ [a-z0-9] + $", RegexOptions.IgnoreCase);
Том Фобеар

4
@TomFobear: це повільніше, ніж чітко вказати [a-zA-Z]
Філіп Лейбаерт

25
Просто для того, щоб врятувати таких людей, як я, від іншого пошуку, Regex знаходиться у System.Text.RegularExpressions Іменний простір
Ерік Барр

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

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

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

5
Мені було б цікаво дізнатись, хто з них швидший (LINQ) або той, що у Філіпа Лейбаерта (Реджекс)?
нам

4
@nam Виконуючи тест на Словник вимови CMU (лише для всіх літер, середня довжина 7,4 символів), це на 1,8 рази швидше, ніж компільовано Regexдля всіх літер, і в 3 рази швидше, ніж Regexдля всіх літер з IgnoreCaseопцією (!).
NetMage

У прийнятій відповіді використовується некомпільований Regex, який буде ще повільніше. Я вважаю за краще рішення LINQ, дякую, що розмістив його :)
Berend Engelbrecht,

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 після другого, якщо оператор знову підтвердить рядок

       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.