Sprawdzanie, czy ciąg zawiera tylko litery w C #


187

Mam ciąg wejściowy i chcę sprawdzić, czy zawiera:

  • Tylko litery lub
  • Tylko litery i cyfry lub
  • Tylko litery, cyfry lub podkreślniki

Aby wyjaśnić, w kodzie mam 3 różne przypadki, z których każda wymaga innej weryfikacji. Jaki jest najprostszy sposób na osiągnięcie tego w C #?

Odpowiedzi:


292

Tylko litery:

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

Tylko litery i cyfry:

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

Tylko litery, cyfry i podkreślniki:

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

31
Zakłada się alfabet łaciński, w którym Char.IsLetter dopuszcza alfabety niełacińskie.
Paul van Brenk

5
Regex.IsMatch (wejście, „^ [a-z0-9] + $”, RegexOptions.IgnoreCase);
Tom Fobear,

4
@TomFobear: jest to wolniejsze niż jawne określenie [a-zA-Z]
Philippe Leybaert

25
Aby uratować ludzi takich jak ja przed kolejnym wyszukiwaniem, Regex znajduje się w przestrzeni nazw System.Text.RegularExpressions
Eric Barr

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

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

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

5
Byłbym ciekawy, który z nich jest szybszy (LINQ) czy ten z Philippe Leybaert (Regex)?
nam

4
@nam Uruchamianie testu ze słownikiem wymowy CMU (tylko wszystkie litery, średnia długość 7,4 znaków), jest 1,8 razy szybszy niż w Regexprzypadku wszystkich liter i 3 razy szybszy niż w Regexprzypadku wszystkich liter z IgnoreCaseopcją (!).
NetMage

W przyjętej odpowiedzi zastosowano nieskompilowaną Regex, która będzie jeszcze wolniejsza. Wolę rozwiązanie LINQ, dzięki za opublikowanie go :)
Berend Engelbrecht

48

Tylko litery:

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

Litery i cyfry:

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

Litery, cyfry i podkreślniki:

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

Zauważ, że wzorce te pasują również do znaków międzynarodowych (w przeciwieństwie do użycia a-zkonstrukcji).


19

Dla tych z Was, którzy wolą nie korzystać z Regex i korzystają z .NET 2.0 Framework (AKA no LINQ):

Tylko litery:

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

Tylko numery:

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

Tylko cyfry lub litery:

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

Tylko cyfry, litery lub znaki podkreślenia:

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

8

Myślę, że dobrym pomysłem jest użycie Wyrażeń regularnych:

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 ma do tego statyczne metody
Philippe Leybaert

4

Możesz zapętlać znaki ciągu i sprawdzać za pomocą metody Char IsLetter, ale możesz także zrobić lewę przy pomocy metody String IndexOfAny, aby wyszukać inne znaki, które nie powinny znajdować się w ciągu.


1

Iteruj przez ciągi znaków i używaj funkcji „Char” zwanych „IsLetter” i „IsDigit”.

Jeśli potrzebujesz czegoś bardziej konkretnego - skorzystaj z klasy Regex.


1

Jeśli jesteś nowicjuszem, możesz pobrać referencje z mojego kodu. To, co zrobiłem, to sprawdzenie, aby uzyskać tylko alfabety i białe znaki! Możesz powtórzyć pętlę for po drugiej instrukcji if, aby ponownie sprawdzić poprawność łańcucha

       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

Niedawno wprowadziłem ulepszenia wydajności dla funkcji sprawdzającej litery w ciągu za pomocą tej strony.

Doszedłem do wniosku, że rozwiązania z wyrażeniem regularnym są 30 razy wolniejsze niż te z testem Char.IsLetterOrDigit.

Nie byliśmy pewni, czy te litery lub cyfry zawierają i potrzebowaliśmy tylko znaków łacińskich, dlatego zaimplementowaliśmy naszą funkcję w oparciu o zdekompilowaną wersję funkcji Char.IsLetterOrDigit.

Oto nasze rozwiązanie:

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

A użycie jest takie:

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

0

Znajdź metodę sprawdzania, czy char jest literą, cyfrą lub spacją, w przeciwnym razie dołącz podkreślnik (możesz dowolnie modyfikować zgodnie z własnymi potrzebami)

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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.