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 #?

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_]+$");

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=='_');

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).


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

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_]+$");
}

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.


1

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

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


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

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

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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.