Memverifikasi bahwa string hanya berisi huruf dalam C #

187

Saya memiliki string masukan dan saya ingin memverifikasi bahwa isinya:

  • Hanya surat atau
  • Hanya huruf dan angka atau
  • Hanya huruf, angka, atau garis bawah

Untuk memperjelas, saya memiliki 3 kasus berbeda dalam kode, masing-masing meminta validasi berbeda. Apa cara paling sederhana untuk mencapai ini di C #?

Bab Yogoo
sumber

Jawaban:

292

Hanya surat:

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

Hanya huruf dan angka:

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

Hanya huruf, angka, dan garis bawah:

Regex.IsMatch(input, @"^[a-zA-Z0-9_]+$");
Philippe Leybaert
sumber
31
Ini mengasumsikan alfabet latin, di mana Char.IsLetter memungkinkan untuk huruf non-latin.
Paul van Brenk
5
Regex.IsMatch (masukan, "^ [a-z0-9] + $", RegexOptions.IgnoreCase);
Tom Fobear
4
@TomFobear: ini lebih lambat dari yang secara eksplisit menentukan [a-zA-Z]
Philippe Leybaert
25
Hanya untuk menyelamatkan orang-orang seperti saya dari satu pencarian lagi, Regex ada di System.Text.RegularExpressions Namespace
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
sumber
5
Saya ingin tahu yang mana yang lebih cepat milik Anda (LINQ) atau yang dari Philippe Leybaert (Regex)?
nam
4
@nam Menjalankan tes terhadap Kamus Pengucapan CMU (semua huruf saja, panjang rata-rata 7,4 karakter), ini 1,8x lebih cepat dari yang dikompilasi Regexuntuk semua huruf, dan 3x lebih cepat dari yang dikompilasi Regexuntuk semua huruf dengan IgnoreCaseopsi (!).
NetMage
Jawaban yang diterima menggunakan Regex yang tidak dikompilasi, yang akan lebih lambat. Saya lebih suka solusi LINQ, terima kasih untuk mempostingnya :)
Berend Engelbrecht
48

Hanya surat-surat:

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

Huruf dan angka:

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

Surat, angka, dan garis bawah:

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

Catatan, pola-pola ini juga cocok dengan karakter internasional (bukan menggunakan a-zkonstruk).

Fredrik Mörk
sumber
19

Bagi Anda yang lebih suka tidak pergi dengan Regex dan berada di .NET 2.0 Framework (AKA no LINQ):

Hanya Surat:

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

Hanya Angka:

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

Hanya Angka Atau Surat:

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

Hanya Angka Atau Huruf Atau Yang Menggarisbawahi:

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

Menurut saya adalah kasus yang baik untuk menggunakan Ekspresi Reguler:

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
sumber
2
Regex memiliki metode statis untuk ini
Philippe Leybaert
4

Anda dapat mengulang pada chars of string dan memeriksa menggunakan Char Method IsLetter tetapi Anda juga dapat melakukan trik menggunakan metode String IndexOfAny untuk mencari karakter lain yang tidak seharusnya berada dalam string.

Baget
sumber
1

Iterate melalui karakter string dan gunakan fungsi 'Char' yang disebut 'IsLetter' dan 'IsDigit'.

Jika Anda membutuhkan sesuatu yang lebih spesifik - gunakan kelas Regex.

Arnis Lapsa
sumber
1

Jika Anda seorang pemula maka Anda dapat mengambil referensi dari kode saya .. apa yang saya lakukan adalah memberi cek sehingga saya hanya bisa mendapatkan huruf dan spasi putih! Anda bisa Mengulangi for for setelah pernyataan if kedua untuk memvalidasi string lagi

       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
sumber
0

Baru-baru ini, saya membuat peningkatan kinerja untuk fungsi yang memeriksa huruf dalam sebuah string dengan bantuan halaman ini.

Saya menemukan bahwa Solusi dengan regex 30 kali lebih lambat daripada yang dengan cek Char.IsLetterOrDigit.

Kami tidak yakin bahwa Huruf atau Angka itu termasuk dan kami hanya membutuhkan karakter Latin sehingga menerapkan fungsi kami berdasarkan versi yang terdekompilasi dari fungsi Char.IsLetterOrDigit.

Inilah solusi kami:

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

Dan penggunaannya seperti ini:

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

Silakan temukan metode untuk memvalidasi jika char adalah huruf, angka atau spasi, jika tidak lampirkan garis bawah (Bebas untuk dimodifikasi sesuai kebutuhan Anda)

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
sumber