Bagaimana cara memvalidasi string untuk hanya mengizinkan karakter alfanumerik di dalamnya?

117

Bagaimana saya bisa memvalidasi string menggunakan Ekspresi Reguler untuk hanya mengizinkan karakter alfanumerik di dalamnya?

(Saya juga tidak ingin mengizinkan spasi).

mrblah
sumber

Jawaban:

181

Gunakan ekspresi berikut:

^[a-zA-Z0-9]*$

yaitu:

using System.Text.RegularExpressions;

Regex r = new Regex("^[a-zA-Z0-9]*$");
if (r.IsMatch(SomeString)) {
  ...
}
cletus
sumber
Bagaimana dengan javascript, hal yang sama saya kira?
mrblah
4
Jika Anda membersihkan nama database atau sesuatu yang internal seperti itu Anda tidak akan peduli jika itu tidak berjalan di negara berbahasa Inggris.
Ognyan Dimitrov
15
Saya benci ekspresi reguler. Saya tahu bahwa saya tidak akan pernah mengingat sintaksnya. Bahkan jika saya mempelajarinya, akan tiba saatnya ketika semuanya dilupakan lagi.
Sentinel
1
@Tokopedia Mungkin, tetapi saat itu saya akan mendelegasikan kepada seseorang yang mengetahui ekspresi reguler ;-)
Sentinel
3
Dikatakan, "jika Anda memecahkan masalah menggunakan ekspresi reguler, maka Anda memiliki dua masalah."
O. Jones
205

Di .NET 4.0 Anda dapat menggunakan LINQ:

if (yourText.All(char.IsLetterOrDigit))
{
    //just letters and digits.
}

yourText.Allakan berhenti mengeksekusi dan mengembalikan falsepertama kalinya char.IsLetterOrDigitlaporan falsesejak kontrak Alltidak dapat dipenuhi maka.

Catatan! jawaban ini tidak memeriksa alfanumerik secara ketat (yang biasanya adalah AZ, az dan 0-9). Jawaban ini memungkinkan karakter lokal suka åäö.

Perbarui 2018-01-29

Sintaks di atas hanya berfungsi jika Anda menggunakan metode tunggal yang memiliki argumen tunggal dengan tipe yang benar (dalam kasus ini char).

Untuk menggunakan banyak kondisi, Anda perlu menulis seperti ini:

if (yourText.All(x => char.IsLetterOrDigit(x) || char.IsWhiteSpace(x)))
{
}
jgauffin.dll
sumber
1
Saya akan terkejut jika tidak lebih cepat. Tidak ada regex untuk dikompilasi atau dievaluasi, hanya perbandingan sederhana.
jgauffin
3
Sekarang itu indah, polos dan sederhana.
Sentinel
3
Tidakkah ini akan gagal jika Anda ingin memastikan teksAnda sudah pasti alfanumerik? Bisa berupa semua angka atau semua huruf tetapi masih memenuhi ketentuan ini.
itsbalur
2
@itsbalur: Ya, tapi bukan itu pertanyaannya.
jgauffin
2
Saya pikir jawaban ini benar-benar salah, dengan asumsi kumpulan alfanumerik adalah AZ, az dan 0-9 karena ini mencakup seluruh jajaran huruf dan angka Unicode, yang termasuk karakter non-Latin juga. Misalnya, char.IsLetterOrDigit('ก')akan kembali true. csharppad.com/gist/f96a6062f9f8f4e974f222ce313df8ca
tia
34

Anda dapat melakukannya dengan mudah dengan fungsi ekstensi daripada regex ...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    for (int i = 0; i < str.Length; i++)
    {
        if (!(char.IsLetter(str[i])) && (!(char.IsNumber(str[i]))))
            return false;
    }

    return true;
}

Per komentar :) ...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    return (str.ToCharArray().All(c => Char.IsLetter(c) || Char.IsNumber(c)));
}
JP Alioto
sumber
2
Ini mungkin masalah selera, tapi saya akan mengungkapkan loop sebagai "foreach (char c in str) {...}". Apakah string kosong akan dianggap OK tergantung pada aplikasinya, jadi saya akan mengambil ini. Saya juga tidak akan memasukkan 6 baris kosong ke dalam rutinitas yang sepele, tapi saya rasa itu adalah gaya C # / Java / C ++ - pembuat kode tampaknya dibayar oleh layar real estat. Bagaimanapun, ini adalah arah yang benar, jadi +1.
Svante
3
Saya pikir kami ingin menggunakan IsDigit dalam situasi ini, daripada IsNumber - IsNumber akan mengembalikan true untuk digit, atau untuk hal-hal yang terlihat seperti angka (pecahan, angka Romawi, dll .; lihat msdn.microsoft.com/ en-us / library / yk2b3t2y.aspx ). Mengingat hal itu, dan jika seseorang merasa sangat jahat, ia dapat memampatkan konten IsAlphaNum lebih jauh: return string.IsNullOrEmpty (str)? false: str.ToCharArray (). All (Char.IsLetterOrDigit);
tumpukan
4
Perhatikan bahwa Char.IsLetter akan bernilai true untuk "huruf" selain a-zA-Z. Misalnya, Jepang あ, Cina 的, Korea 한 dll dianggap "huruf" Unicode. Jika ini adalah niat Anda, maka baiklah, tetapi menilai dari berbagai ekspresi regex di jawaban lain, ini mungkin bukan yang paling dianggap sebagai alfa [numerik].
Dono
Dalam kasus saya, selain IsLetter dan IsNumber, saya juga membutuhkan IsWhiteSpace jadi saya menambahkannya ke kode Anda dan berfungsi dengan sempurna!
Ben Junior
gunakan char.IsLetterOrDigitsebagai gantinya IsLetter + IsNumber
nick_n_a
17

Sementara saya pikir solusi berbasis regex mungkin adalah cara yang saya lakukan, saya akan tergoda untuk merangkum ini dalam sebuah tipe.

public class AlphaNumericString
{
    public AlphaNumericString(string s)
    {
        Regex r = new Regex("^[a-zA-Z0-9]*$");
        if (r.IsMatch(s))
        {
            value = s;                
        }
        else
        {
            throw new ArgumentException("Only alphanumeric characters may be used");
        }
    }

    private string value;
    static public implicit operator string(AlphaNumericString s)
    {
        return s.value;
    }
}

Sekarang, ketika Anda membutuhkan string yang divalidasi, Anda dapat membuat tanda tangan metode memerlukan AlphaNumericString, dan tahu bahwa jika Anda mendapatkannya, itu valid (selain null). Jika seseorang mencoba mengirimkan string yang tidak divalidasi, itu akan menghasilkan kesalahan kompilator.

Anda bisa menjadi lebih menarik dan mengimplementasikan semua operator kesetaraan, atau cast eksplisit ke AlphaNumericString dari string ol biasa, jika Anda peduli.

kyoryu
sumber
Saya belum pernah melihat pendekatan ini, tetapi saya suka kejelasan maksud dan pembenaran Anda. +1.
Cory House
1
Ini baru bagiku. Saya mencoba untuk memahami static public implicit operator stringbagiannya
Hassan Gulzar
8

Saya perlu memeriksa AZ, az, 0-9; tanpa regex (meskipun OP meminta regex).

Memadukan berbagai jawaban dan komentar di sini, dan diskusi dari https://stackoverflow.com/a/9975693/292060 , ini menguji huruf atau angka, menghindari huruf bahasa lain, dan menghindari angka lain seperti karakter pecahan.

if (!String.IsNullOrEmpty(testString)
    && testString.All(c => Char.IsLetterOrDigit(c) && (c < 128)))
{
    // Alphanumeric.
}
selamat tinggal
sumber
4

^\w+$ akan memperbolehkan a-zA-Z0-9_

Gunakan ^[a-zA-Z0-9]+$untuk melarang garis bawah.

Perhatikan bahwa keduanya memerlukan string yang tidak boleh kosong. Menggunakan *alih-alih +mengizinkan string kosong.

Peter Boughton
sumber
bagaimana cara mengubah ^ \ w + $ Anda agar juga mengizinkan "-" karakter dasbor?
Neal Davis
@NealDavis^[\w-]+$
Zachafer
2

Untuk memeriksa apakah string tersebut merupakan kombinasi huruf dan angka, Anda dapat menulis ulang jawaban @jgauffin sebagai berikut menggunakan .NET 4.0 dan LINQ:

if(!string.IsNullOrWhiteSpace(yourText) && 
yourText.Any(char.IsLetter) && yourText.Any(char.IsDigit))
{
   // do something here
}
Thabiso Mofokeng
sumber
Ini akan salah mengenali string yang berisi karakter lain bersama dengan alfanumerik ...
nsimeonov
1

Jawaban yang sama seperti di sini .

Jika Anda menginginkan A-z 0-9pemeriksaan ASCII non-regex , Anda tidak dapat menggunakannya char.IsLetterOrDigit()karena itu menyertakan karakter Unicode lainnya.

Apa yang dapat Anda lakukan adalah memeriksa rentang kode karakter.

  • 48 -> 57 adalah angka
  • 65 -> 90 adalah huruf kapital
  • 97 -> 122 adalah huruf kecil

Berikut ini sedikit lebih bertele-tele, tetapi ini untuk kemudahan pemahaman daripada untuk kode golf.

    public static bool IsAsciiAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
        {
            return false;
        }

        for (int i = 0; i < str.Length; i++)
        {
            if (str[i] < 48) // Numeric are 48 -> 57
            {
                return false;
            }

            if (str[i] > 57 && str[i] < 65) // Capitals are 65 -> 90
            {
                return false;
            }

            if (str[i] > 90 && str[i] < 97) // Lowers are 97 -> 122
            {
                return false;
            }

            if (str[i] > 122)
            {
                return false;
            }
        }

        return true;
    }
Douglas Gaskell
sumber
0

Berdasarkan jawaban cletus Anda dapat membuat ekstensi baru.

public static class StringExtensions
{        
    public static bool IsAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
            return false;

        Regex r = new Regex("^[a-zA-Z0-9]*$");
        return r.IsMatch(str);
    }
}
Alexa Adrian
sumber
-8

Saya menyarankan untuk tidak bergantung pada kode siap pakai dan built-in dalam kerangka .NET, coba berikan solusi baru .. inilah yang saya lakukan ..

public  bool isAlphaNumeric(string N)
{
    bool YesNumeric = false;
    bool YesAlpha = false;
    bool BothStatus = false;


    for (int i = 0; i < N.Length; i++)
    {
        if (char.IsLetter(N[i]) )
            YesAlpha=true;

        if (char.IsNumber(N[i]))
            YesNumeric = true;
    }

    if (YesAlpha==true && YesNumeric==true)
    {
        BothStatus = true;
    }
    else
    {
        BothStatus = false;
    }
    return BothStatus;
}
Mahdi Al Aradi
sumber
2
Bisakah Anda menambahkan beberapa penjelasan ke kode Anda, hanya kode dumping umumnya tidak disukai di sini
Draken
Juga mereka meminta ekspresi reguler, ini bukan ekspresi reguler
Draken
Terima kasih atas komentar dan observasi .. seperti yang saya sarankan saya memiliki pendekatan sendiri untuk menulis kode.
Mahdi Al Aradi
5
Komentar Anda tentang tidak mengandalkan kode pra-build di .Net tidak masuk akal, tentunya jika Anda tidak harus mengandalkan kode pra-build, Anda tidak boleh menggunakan char.IsNumber()metode karena itu adalah kode yang sudah dibuat sebelumnya?
Draken
4
Kode ini adalah contoh bagus mengapa menciptakannya kembali sendiri adalah ide yang buruk - kode ini tidak benar-benar melakukan apa yang ingin Anda lakukan! (String "@ 1a" akan mengembalikan nilai true dengan tidak benar, string "a" akan mengembalikan false)
Flexo