Ekspresi Reguler untuk alfanumerik dan garis bawah

585

Saya ingin memiliki ekspresi reguler yang memeriksa apakah string hanya berisi huruf besar dan kecil, angka, dan garis bawah.


sumber
9
Sangat disayangkan bahwa mesin regex yang berbeda memiliki cara yang berbeda untuk mencocokkan alfanumerik. Sebuah pertanyaan seperti ini (agak tidak jelas, tanpa bahasa / rasa regex diindikasikan) membutuhkan jawaban yang sangat panjang, atau setidaknya sangat terorganisir untuk masing-masing rasa.
Wiktor Stribiżew

Jawaban:

939

Untuk mencocokkan string yang hanya berisi karakter tersebut (atau string kosong), cobalah

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

Ini berfungsi untuk .NET regular expressions, dan mungkin juga banyak bahasa lain.

Hancurkan:

^ : start of string
[ : beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9 : any digit
_ : underscore
] : end of character group
* : zero or more of the given characters
$ : end of string

Jika Anda tidak ingin mengizinkan string kosong, gunakan + alih-alih *.


Seperti yang telah ditunjukkan orang lain, beberapa bahasa regex memiliki bentuk steno untuk [a-zA-Z0-9_]. Dalam bahasa .NET regex, Anda bisa mengaktifkan perilaku ECMAScript dan menggunakannya \wsebagai singkatan (menghasilkan ^\w*$atau ^\w+$). Perhatikan bahwa dalam bahasa lain, dan secara default dalam .NET, \wagak lebih luas, dan akan cocok dengan jenis karakter Unicode lainnya (terima kasih kepada Jan untuk menunjukkan ini). Jadi jika Anda benar-benar berniat untuk mencocokkan hanya karakter-karakter itu, menggunakan formulir eksplisit (lebih panjang) mungkin yang terbaik.

Charlie
sumber
8
Jika Anda pernah pergi ke Jerman atau jika Anda pernah melihat hampir semua teks bahasa Jerman Anda akan melihat apa yang saya katakan.
Pemrogram Windows
30
\ w dan [A-Za-z0-9_] tidak setara dalam kebanyakan rasa regex. meliputi surat-surat dengan diakritik, surat dari skrip lain, dll.
Jan Goyvaerts
4
Pertanyaan aslinya memang mengatakan "huruf besar dan kecil", sehingga tampaknya "huruf" dari skrip non-Latin harus cocok.
Trejkaz
3
[\p{upper}\p{lower}\p{gc=Number}_]adalah semua yang perlu Anda lakukan dengan benar, dengan anggapan tidak ada kombinasi karakter.
tchrist
1
Sepertinya preg_match membutuhkan pola Anda untuk ditutup dengan pembatas, yang biasanya garis miring. Jadi Anda perlu "/ ^ [a-zA-Z0-9 _] * $ /". Lihat pertanyaan ini untuk info lebih lanjut: stackoverflow.com/questions/6445133/… . Lihat juga halaman ini: forums.phpfreaks.com/topic/…
Charlie
346

Ada banyak kata-kata kasar di sini, dan saya sangat menentangnya, jadi, jawaban konklusif saya adalah:

/^\w+$/

\wsetara dengan [A-Za-z0-9_], yang cukup banyak yang Anda inginkan. (kecuali kami memperkenalkan unicode ke dalam campuran)

Menggunakan +quantifier Anda akan cocok dengan satu atau lebih karakter. Jika Anda ingin menerima string kosong juga, gunakan *saja.

kch
sumber
67
\wbiasanya tidak terbatas pada ASCII saja.
tchrist
26
Bahasa Inggris bukan satu-satunya bahasa di dunia, jadi ini harus menjadi jawaban yang diterima, bukan [a-z]dan variasinya. \wakan menangkap karakter non-latin juga. Suka šēēāatauкукареку
Alex
1
Divalidasi pada halaman 318 dari O'Reilly "Menguasai Ekspresi Reguler"
guidotex
36

Anda ingin memeriksa bahwa setiap karakter sesuai dengan kebutuhan Anda, itulah sebabnya kami menggunakan:

[A-Za-z0-9_]

Dan Anda bahkan dapat menggunakan versi steno:

\w

Yang setara (dalam beberapa rasa regex, jadi pastikan Anda memeriksa sebelum menggunakannya). Kemudian untuk menunjukkan bahwa seluruh string harus cocok, Anda menggunakan:

^

Untuk menunjukkan string harus dimulai dengan karakter itu, lalu gunakan

$

Untuk menunjukkan string harus diakhiri dengan karakter itu. Kemudian gunakan

\w+ or \w*

Untuk menunjukkan "1 atau lebih", atau "0 atau lebih". Menyatukan semuanya, kami memiliki:

^\w*$
Anton
sumber
10
\ w dan [A-Za-z0-9_] tidak setara dalam kebanyakan rasa regex. meliputi surat-surat dengan diakritik, surat dari skrip lain, dll.
Jan Goyvaerts
32

Um ... pertanyaan: Apakah harus memiliki setidaknya satu karakter atau tidak? Bisakah itu string kosong?

^[A-Za-z0-9_]+$

Akan melakukan setidaknya satu huruf besar atau kecil alfanumerik atau garis bawah. Jika panjangnya nol, maka ganti + untuk *

^[A-Za-z0-9_]*$

Edit:

Jika diakritik perlu dimasukkan (seperti cedilla - ç) maka Anda perlu menggunakan karakter kata yang melakukan hal yang sama seperti di atas, tetapi termasuk karakter diakritik:

^\w+$

Atau

^\w*$
BenAlabaster
sumber
Nah sekarang setelah Anda menyebutkannya, saya juga merindukan sejumlah karakter Prancis lainnya ...
BenAlabaster
1
\ w sama dengan [\ w] dengan sedikit usaha mengetik
Jan Goyvaerts
Ya, Anda masih memerlukan + atau * dan ^ dan $ - \ w hanya memeriksa apakah itu berisi karakter kata, bukan hanya berisi karakter kata ...
BenAlabaster
anehnya, ini masih memungkinkan tanda $.
Induster
@Induster, itu karena apa yang baru saja ditunjukkan BenAlabaster
Sebas
27

Meskipun lebih verbose daripada \w, saya pribadi menghargai keterbacaan nama kelas karakter POSIX lengkap ( http://www.zytrax.com/tech/web/regex.htm#special ), jadi saya akan mengatakan:

^[[:alnum:]_]+$

Namun, sementara dokumentasi di tautan di atas menyatakan bahwa \w"Cocokkan karakter apa pun dalam rentang 0 - 9, A - Z dan a - z (setara dengan POSIX [: alnum:])", saya belum menemukan ini benar . Tidak dengan cara apa pun grep -P. Anda harus secara eksplisit memasukkan garis bawah jika Anda menggunakan [:alnum:]tetapi tidak jika Anda menggunakannya \w. Anda tidak bisa mengalahkan yang berikut ini karena singkat dan manis:

^\w+$

Bersamaan dengan keterbacaan, menggunakan kelas karakter POSIX ( http://www.regular-expressions.info/posixbrackets.html ) berarti bahwa regex Anda dapat bekerja pada string non ASCII, yang tidak akan dilakukan oleh regex berbasis rentang karena mereka bergantung pada urutan dasar karakter ASCII yang mungkin berbeda dari rangkaian karakter lain dan karenanya akan mengecualikan beberapa karakter non-ASCII (huruf seperti œ) yang mungkin ingin Anda tangkap.

Hari Davis Waterbury
sumber
22

Dalam Ilmu Komputer, nilai alfanumerik sering berarti karakter pertama bukan angka tetapi alfabet atau garis bawah. Setelah itu karakter bisa 0-9, A-Z, a-z, atau garis bawah ( _).

Inilah cara Anda melakukannya:

Diuji di bawah php:

$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'

atau ambil ini

^[A-Za-z_][A-Za-z\d_]*$

dan letakkan dalam bahasa pengembangan Anda.

Danuel O'Neal
sumber
17

Bagaimana tentang:

^([A-Za-z]|[0-9]|_)+$

... jika Anda ingin menjadi eksplisit, atau:

^\w+$

... jika Anda lebih suka ringkas (Sintaks Perl).

Drew Hall
sumber
12

gunakan lookaheads untuk melakukan hal "setidaknya satu". Percayalah, ini jauh lebih mudah.

Berikut ini contoh yang membutuhkan 1-10 karakter, yang mengandung setidaknya satu digit dan satu huruf:

^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$

CATATAN: bisa menggunakan \ w tetapi kemudian pertimbangan ECMA / Unicode ikut bermain meningkatkan cakupan karakter dari \ w "karakter karakter".

boooloooo
sumber
Bagaimana yang akan kita lakukan jika kita ingin menambahkan _ dan - ke daftar?
Rahi
10

Coba ekstensi multi-bahasa ini yang telah saya buat untuk string.

IsAlphaNumeric - String harus mengandung paling sedikit 1 alpha (huruf dalam kisaran Unicode, ditentukan dalam charSet) dan minimal 1 angka (ditentukan dalam numSet). Juga, string hanya terdiri dari alfa dan angka.

IsAlpha - String harus mengandung setidaknya 1 alpha (dalam bahasa yang ditentukan charSet) dan hanya terdiri dari alpha.

IsNumeric - String harus mengandung setidaknya 1 angka (dalam bahasa yang ditentukan numSet) dan hanya terdiri dari angka.

Rentang charSet / numSet untuk bahasa yang diinginkan dapat ditentukan. Rentang Unicode tersedia di tautan di bawah ini:

http://www.ssec.wisc.edu/~tomw/java/unicode.html

API:

    public static bool IsAlphaNumeric(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";
        const string numSet = @"0-9";

        //Greek
        //const string charSet = @"\u0388-\u03EF";            
        //const string numSet = @"0-9";

        //Bengali
        //const string charSet = @"\u0985-\u09E3";
        //const string numSet = @"\u09E6-\u09EF";

        //Hindi
        //const string charSet = @"\u0905-\u0963";
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^(?=[" + numSet + @"]*?[" + charSet + @"]+)(?=[" + charSet + @"]*?[" + numSet + @"]+)[" + charSet + numSet +@"]+$").Success;
    }

    public static bool IsNumeric(this string stringToTest)
    {
        //English
        const string numSet = @"0-9";

        //Hindi
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^[" + numSet + @"]+$").Success;
    }

    public static bool IsAlpha(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";

        return Regex.Match(stringToTest, @"^[" + charSet + @"]+$").Success;
    }

Penggunaan:

        //English
        string test = "AASD121asf";

        //Greek
        //string test = "Ϡϛβ123";

        //Bengali
        //string test = "শর৩৮";

        //Hindi
        //string test = @"क़लम३७ख़";

        bool isAlphaNum = test.IsAlphaNumeric();
Shantanu
sumber
@ Shah: Saya telah menambahkan satu-satunya huruf (dan juga angka saja).
Shantanu
8

Regex berikut cocok dengan karakter alfanumerik dan garis bawah:

^[a-zA-Z0-9_]+$

Misalnya, dalam Perl:

#!/usr/bin/perl -w

my $arg1 = $ARGV[0];

# check that the string contains *only* one or more alphanumeric chars or underscores
if ($arg1 !~ /^[a-zA-Z0-9_]+$/) {
  print "Failed.\n";
} else {
    print "Success.\n";
}
Jay
sumber
Pola dalam kode Anda sudah benar, tetapi pola di atas hanya memeriksa satu contoh.
BenAlabaster
Itu disengaja, contoh kode dimaksudkan sebagai penggunaan klarifikasi dalam benar-benar memeriksa string. Juga mengapa kode memiliki awal dan akhir penanda garis juga yang tidak ada dalam contoh regex.
Jay
1
@Windows programmer - en.wikipedia.org/wiki/Alphanumeric - alfabet latin , bukan "set karakter latin" yang termasuk diacritics dll. Murni masalah semantik, tapi saya pribadi menggunakan penggunaan umum istilah alfanumerik seperti AZ dan 0-9.
Jay
2
ñ adalah huruf alfabet dalam bahasa Spanyol, termasuk di Amerika Latin.
Pemrogram Windows
2
"Saya ingin memiliki ekspresi reguler yang memeriksa apakah string hanya berisi huruf besar dan kecil, angka, dan garis bawah" tidak membatasi ke huruf Latin. "Regex berikut cocok dengan karakter alfanumerik dan garis bawah" tidak terbatas pada huruf Latin. "^ [a-zA-Z0-9 _] + $" gagal.
Pemrogram Windows
6

Ini harus bekerja dalam sebagian besar kasus.

/^[\d]*[a-z_][a-z\d_]*$/gi

Dan maksud saya,

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False


Penjelasan

  1. ^ ... $ - cocok dengan pola yang dimulai dan diakhiri dengan
  2. [\d]* - cocok dengan nol atau lebih digit
  3. [a-z_] - cocok dengan alfabet atau garis bawah
  4. [a-z\d_]* - cocok dengan alfabet atau angka atau garis bawah
  5. /gi - cocok secara global di seluruh string dan case-insensitive
Chinmaya Pati
sumber
2
Pertanyaan aslinya tidak memiliki persyaratan bahwa surat itu harus ada.
Dmitry Kuzminov
Surat apa yang kamu bicarakan? Regex saya berisi yang ditanyakan dalam pertanyaan. Huruf, angka, garis bawah
Chinmaya Pati
itu 1234adalah kata dari bahasa yang diminta oleh penulis. Bahasa Anda lebih membatasi.
Dmitry Kuzminov
4

Bagi saya ada masalah di mana saya ingin membedakan antara alpha, numeric dan alpha numeric, jadi untuk memastikan string alfanumerik mengandung setidaknya satu alpha dan setidaknya satu numerik, saya menggunakan:

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$
mylesmckeown
sumber
Apa yang saya inginkan ... Terima kasih
Aniket kale
3

Berikut adalah regex untuk apa yang Anda inginkan dengan quantifier untuk menentukan setidaknya 1 karakter dan tidak lebih dari 255 karakter

[^a-zA-Z0-9 _]{1,255}
mson
sumber
2

Saya yakin Anda tidak menggunakan karakter Latin dan Unicode di pertandingan Anda. Misalnya, jika Anda perlu mengambil karakter "ã" atau "ü", penggunaan "\ w" tidak akan berfungsi.

Anda dapat, sebagai alternatif, menggunakan pendekatan ini:

^[A-ZÀ-Ýa-zà-ý0-9_]+$

Semoga ini bisa membantu!

Marcio Martins
sumber
1

Untuk memeriksa seluruh string dan tidak mengizinkan string kosong, coba

^[A-Za-z0-9_]+$
David Norman
sumber
1

^\w*$ akan berfungsi untuk kombinasi di bawah ini

1
123
1av
pRo
av1
Mukund
sumber
Bagaimana dengan garis kosong. Apakah ini juga merupakan string alfanumerik?
v010dya
0

ini bekerja untuk saya, Anda dapat mencoba

[\\p{Alnum}_]
Saurabh
sumber
0

Ini berfungsi untuk saya, temukan ini di "Menguasai Ekspresi Reguler" O'Reilly:

/^\w+$/

Penjelasan:

  • ^ menegaskan posisi pada awal string
    • \ w + cocok dengan karakter kata apa pun (sama dengan [a-zA-Z0-9_])
    • "+" Quantifier - Mencocokkan antara waktu satu dan tidak terbatas, sebanyak mungkin, memberikan kembali sesuai kebutuhan (serakah)
  • $ menegaskan posisi di akhir string

Verifikasikan diri Anda:

const regex = /^\w+$/;
const str = `nut_cracker_12`;
let m;

if ((m = regex.exec(str)) !== null) {
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Mihir Kumar
sumber