Verificando se uma sequência contém apenas letras em C #

187

Eu tenho uma string de entrada e quero verificar se ela contém:

  • Apenas letras ou
  • Apenas letras e números ou
  • Apenas letras, números ou sublinhado

Para esclarecer, eu tenho 3 casos diferentes no código, cada um pedindo validação diferente. Qual é a maneira mais simples de conseguir isso em c #?

Bab Yogoo
fonte

Respostas:

292

Apenas letras:

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

Apenas letras e números:

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

Apenas letras, números e sublinhado:

Regex.IsMatch(input, @"^[a-zA-Z0-9_]+$");
Philippe Leybaert
fonte
31
Isso pressupõe um alfabeto latino, onde Char.IsLetter permite alfabetos não latinos.
Paul van BRENK
5
Regex.IsMatch (input, "^ [a-z0-9] + $", RegexOptions.IgnoreCase);
Tom Fobear 10/10
4
@ TomFobear: isso é mais lento do que especificar explicitamente [a-zA-Z] #
Philippe Leybaert 11/11
25
Apenas para salvar pessoas como eu em mais uma pesquisa, o Regex está no espaço para nome 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=='_');
Muhammad Hasan Khan
fonte
5
Gostaria de saber qual é o seu mais rápido (LINQ) ou o de Philippe Leybaert (Regex)?
nam
4
@nam Executando um teste no Dicionário de Pronúncia da CMU (somente letras, comprimento médio de 7.4 caracteres), é 1,8x mais rápido que o compilado Regexpara todas as letras e 3x mais rápido que o compilado Regexpara todas as letras com a IgnoreCaseopção (!).
NetMage 15/05
A resposta aceita usa Regex descompilado, que será ainda mais lento. Eu prefiro a solução LINQ, obrigado por publicá-la :)
Berend Engelbrecht
48

Somente letras:

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

Letras e números:

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

Letras, números e sublinhado:

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

Observe que esses padrões também correspondem a caracteres internacionais (ao contrário de usar a a-zconstrução).

Fredrik Mörk
fonte
19

Para aqueles que preferem não usar o Regex e estão no .NET 2.0 Framework (AKA no LINQ):

Apenas letras:

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

Apenas números:

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

Apenas números ou letras:

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

Somente números ou letras ou sublinhados:

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

Eu acho que é um bom caso usar expressões regulares:

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_]+$");
}
CMS
fonte
2
Regex tem métodos estáticos para esta
Philippe Leybaert
4

Você pode fazer um loop nos caracteres da string e verificar usando o método Char IsLetter, mas também pode fazer um truque usando o método String IndexOfAny para pesquisar outros caracteres que não devem estar na string.

Baget
fonte
1

Itere através de caracteres de strings e use funções de 'Char' chamadas 'IsLetter' e 'IsDigit'.

Se você precisar de algo mais específico - use a classe Regex.

Arnis Lapsa
fonte
1

Se você é um novato, pode consultar o meu código. O que fiz foi marcar um cheque para que eu pudesse obter apenas os alfabetos e os espaços em branco! Você pode repetir o loop for após a segunda instrução if para validar a sequência novamente

       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();
       }
Khyzar Ishaq Kapoor
fonte
0

Recentemente, fiz melhorias de desempenho para uma função que verifica letras em uma string com a ajuda desta página.

Eu descobri que as soluções com regex são 30 vezes mais lentas que as da verificação Char.IsLetterOrDigit.

Não tínhamos certeza de que essas letras ou dígitos incluíam e precisávamos apenas de caracteres latinos, portanto implementamos nossa função com base na versão descompilada da função Char.IsLetterOrDigit.

Aqui está a nossa solução:

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 o uso é assim:

 if( logicalId.All(c => CheckAllowedChars(c)))
 { // Do your stuff here.. }
Aytaç Utku TOPAL
fonte
0

Encontre o método para validar se char é letra, número ou espaço; caso contrário, anexe o sublinhado (fique à vontade para modificar de acordo com suas necessidades)

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;
}
Alfred Rojas
fonte