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 ofstring[: beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9: any digit
_ : underscore
]:endof character group*: zero or more of the given characters
$ :endofstring
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.
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.
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 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:
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.
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 ( _).
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:
//Englishstring test ="AASD121asf";//Greek//string test = "Ϡϛβ123";//Bengali//string test = "শর৩৮";//Hindi//string test = @"क़लम३७ख़";bool isAlphaNum = test.IsAlphaNumeric();
@ 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 -wmy $arg1 = $ARGV[0];# check that the string contains *only* one or more alphanumeric chars or underscoresif($arg1 !~/^[a-zA-Z0-9_]+$/){print"Failed.\n";}else{print"Success.\n";}
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.
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:
Jika Anda hanya ingin bahasa Latin do p {Latin} alih-alih p {L}
Agustin
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:
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}`);});}
Jawaban:
Untuk mencocokkan string yang hanya berisi karakter tersebut (atau string kosong), cobalah
Ini berfungsi untuk .NET regular expressions, dan mungkin juga banyak bahasa lain.
Hancurkan:
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\w
sebagai singkatan (menghasilkan^\w*$
atau^\w+$
). Perhatikan bahwa dalam bahasa lain, dan secara default dalam .NET,\w
agak 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.sumber
[\p{upper}\p{lower}\p{gc=Number}_]
adalah semua yang perlu Anda lakukan dengan benar, dengan anggapan tidak ada kombinasi karakter.Ada banyak kata-kata kasar di sini, dan saya sangat menentangnya, jadi, jawaban konklusif saya adalah:
\w
setara 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.sumber
\w
biasanya tidak terbatas pada ASCII saja.[a-z]
dan variasinya.\w
akan menangkap karakter non-latin juga. Sukašēēā
atauкукареку
Anda ingin memeriksa bahwa setiap karakter sesuai dengan kebutuhan Anda, itulah sebabnya kami menggunakan:
Dan Anda bahkan dapat menggunakan versi steno:
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
Untuk menunjukkan "1 atau lebih", atau "0 atau lebih". Menyatukan semuanya, kami memiliki:
sumber
Um ... pertanyaan: Apakah harus memiliki setidaknya satu karakter atau tidak? Bisakah itu string kosong?
Akan melakukan setidaknya satu huruf besar atau kecil alfanumerik atau garis bawah. Jika panjangnya nol, maka ganti + untuk *
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:
Atau
sumber
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: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 pungrep -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: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.
sumber
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:
atau ambil ini
dan letakkan dalam bahasa pengembangan Anda.
sumber
Bagaimana tentang:
... jika Anda ingin menjadi eksplisit, atau:
... jika Anda lebih suka ringkas (Sintaks Perl).
sumber
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:
CATATAN: bisa menggunakan \ w tetapi kemudian pertimbangan ECMA / Unicode ikut bermain meningkatkan cakupan karakter dari \ w "karakter karakter".
sumber
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:
Penggunaan:
sumber
Regex berikut cocok dengan karakter alfanumerik dan garis bawah:
Misalnya, dalam Perl:
sumber
Ini harus bekerja dalam sebagian besar kasus.
/^[\d]*[a-z_][a-z\d_]*$/gi
Dan maksud saya,
Penjelasan
^ ... $
- cocok dengan pola yang dimulai dan diakhiri dengan[\d]*
- cocok dengan nol atau lebih digit[a-z_]
- cocok dengan alfabet atau garis bawah[a-z\d_]*
- cocok dengan alfabet atau angka atau garis bawah/gi
- cocok secara global di seluruh string dan case-insensitivesumber
1234
adalah kata dari bahasa yang diminta oleh penulis. Bahasa Anda lebih membatasi.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:
sumber
Berikut adalah regex untuk apa yang Anda inginkan dengan quantifier untuk menentukan setidaknya 1 karakter dan tidak lebih dari 255 karakter
sumber
Bagi Anda yang mencari kecocokan alfanumerik unicode, Anda mungkin ingin melakukan sesuatu seperti:
Bacaan lebih lanjut di http://unicode.org/reports/tr18/ dan di http://www.regular-expressions.info/unicode.html
sumber
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:
Semoga ini bisa membantu!
sumber
Untuk memeriksa seluruh string dan tidak mengizinkan string kosong, coba
sumber
^\w*$
akan berfungsi untuk kombinasi di bawah inisumber
ini bekerja untuk saya, Anda dapat mencoba
sumber
Ini berfungsi untuk saya, temukan ini di "Menguasai Ekspresi Reguler" O'Reilly:
Penjelasan:
Verifikasikan diri Anda:
sumber