Verifica che una stringa contenga solo lettere in C #


187

Ho una stringa di input e voglio verificare che contenga:

  • Solo lettere o
  • Solo lettere e numeri o
  • Solo lettere, numeri o trattini bassi

Per chiarire, ho 3 casi diversi nel codice, ognuno richiede una convalida diversa. Qual è il modo più semplice per raggiungere questo obiettivo in C #?

Risposte:


292

Solo lettere:

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

Solo lettere e numeri:

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

Solo lettere, numeri e trattini bassi:

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

31
Ciò presuppone un alfabeto latino, in cui Char.IsLetter consente alfabeti non latini.
Paul van Brenk,

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

4
@TomFobear: è più lento che specificare esplicitamente [a-zA-Z]
Philippe Leybaert,

25
Solo per salvare persone come me da un'altra ricerca, Regex è nello spazio dei nomi System.Text.RegularExpressions
Eric Barr

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

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

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

5
Sarei curioso di sapere quale è il tuo più veloce (LINQ) o quello di Philippe Leybaert (Regex)?
nam

4
@nam Eseguendo un test contro il Dizionario di pronuncia CMU (solo tutte le lettere, lunghezza media 7,4 caratteri), questo è 1,8 volte più veloce di quello compilato Regexper tutte le lettere e 3 volte più veloce di quello compilato Regexper tutte le lettere con l' IgnoreCaseopzione (!).
NetMage

La risposta accettata utilizza Regex non compilato, che sarà ancora più lento. Preferisco la soluzione LINQ, grazie per averla pubblicata :)
Berend Engelbrecht il

48

Solo lettere:

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

Lettere e numeri:

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

Lettere, numeri e trattini bassi:

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

Nota, questi schemi corrispondono anche a caratteri internazionali (invece di usare il a-zcostrutto).


19

Per quelli di voi che preferiscono non andare con Regex e sono su .NET 2.0 Framework (AKA no LINQ):

Solo lettere:

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

Solo numeri:

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

Solo numeri o lettere:

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

Solo numeri o lettere o caratteri di sottolineatura:

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

8

Penso che sia un buon caso usare le espressioni regolari:

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 ha metodi statici per questo
Philippe Leybaert,

4

È possibile eseguire il ciclo sui caratteri di stringa e verificare utilizzando il metodo Char IsLetter, ma è anche possibile eseguire un trucco utilizzando il metodo String IndexOfAny per cercare altri caratteri che non si suppone si trovino nella stringa.


1

Scorrere i caratteri delle stringhe e utilizzare le funzioni di "Char" chiamate "IsLetter" e "IsDigit".

Se hai bisogno di qualcosa di più specifico, usa la classe Regex.


1

Se sei un principiante, puoi prendere riferimento al mio codice .. quello che ho fatto è stato mettere un assegno in modo da poter ottenere solo gli alfabeti e gli spazi bianchi! È possibile ripetere il ciclo for dopo la seconda istruzione if per convalidare nuovamente la stringa

       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

Di recente, ho apportato miglioramenti delle prestazioni per una funzione che controlla le lettere in una stringa con l'aiuto di questa pagina.

Ho capito che le soluzioni con regex sono 30 volte più lente di quelle con il controllo Char.IsLetterOrDigit.

Non eravamo sicuri che quelle lettere o cifre includessero e avessimo bisogno solo di caratteri latini, quindi implementammo la nostra funzione in base alla versione decompilata della funzione Char.IsLetterOrDigit.

Ecco la nostra soluzione:

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

E l'uso è così:

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

0

Si prega di trovare il metodo per convalidare se carattere è lettera, numero o spazio, altrimenti allegare il trattino basso (Essere liberi di modificare in base alle proprie esigenze)

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.