Saya ingin ekspresi reguler memeriksanya
kata sandi harus terdiri dari delapan karakter termasuk satu huruf besar, satu karakter khusus dan karakter alfanumerik.
Dan inilah ekspresi validasi saya yang terdiri dari delapan karakter termasuk satu huruf besar, satu huruf kecil, dan satu angka atau karakter khusus.
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"
Bagaimana saya bisa menulisnya untuk kata sandi yang harus terdiri dari delapan karakter termasuk satu huruf besar, satu karakter khusus dan karakter alfanumerik?
Jawaban:
Ekspresi reguler yang Anda cari kemungkinan besar akan menjadi besar dan mimpi buruk untuk dipertahankan terutama bagi orang-orang yang tidak begitu akrab dengan ekspresi reguler.
Saya rasa akan lebih mudah untuk memecah ekspresi reguler Anda dan melakukannya sedikit demi sedikit. Mungkin perlu sedikit lebih banyak untuk dilakukan, tetapi saya cukup yakin bahwa mempertahankan dan men-debugnya akan lebih mudah. Ini juga akan memungkinkan Anda untuk memberikan pesan kesalahan yang lebih terarah kepada pengguna Anda (selain hanya
Invalid Password
) yang akan meningkatkan pengalaman pengguna.Dari apa yang saya lihat, Anda cukup fasih menggunakan ekspresi reguler, jadi saya berasumsi bahwa memberi Anda ekspresi reguler untuk melakukan apa yang Anda butuhkan akan sia-sia.
Melihat komentar Anda, inilah yang akan saya lakukan:
Harus delapan karakter Panjang: Anda tidak memerlukan ekspresi reguler untuk ini. Menggunakan
.Length
properti sudah cukup.Menyertakan satu huruf besar: Anda dapat menggunakan
[A-Z]+
ekspresi reguler. Jika string berisi setidaknya satu huruf besar, ekspresi reguler ini akan menghasilkantrue
.Satu karakter khusus: Anda dapat menggunakan yang
\W
mana akan cocok dengan karakter apa pun yang bukan huruf atau angka atau yang lain, Anda dapat menggunakan sesuatu seperti itu[!@#]
untuk menentukan daftar karakter khusus. Catatan bahwa meskipun karakter seperti$
,^
,(
dan)
karakter khusus dalam bahasa ekspresi reguler, sehingga mereka harus melarikan diri seperti:\$
. Jadi singkatnya, Anda mungkin menggunakan\W
.Karakter alfanumerik: Penggunaan
\w+
harus cocok dengan huruf dan angka apa pun serta garis bawah.Lihat tutorial ini untuk informasi lebih lanjut.
sumber
Dalam satu baris:
Sunting 2019-05-28:
Anda harus mencocokkan seluruh string masukan. Jadi, Anda bisa mengapit regex di antara
^
dan$
untuk mencegah asumsi kecocokan parsial secara tidak sengaja sebagai pencocokan seluruh input:Sumber:
Ekspresi pencocokan kata sandi
Validasi Kekuatan Kata Sandi dengan Ekspresi Reguler
sumber
^
dan$
. Coba ini:^((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,8})$
Begitu banyak jawaban .... semuanya buruk!
Ekspresi reguler tidak memiliki operator DAN, jadi cukup sulit untuk menulis regex yang cocok dengan kata sandi yang valid, ketika validitas ditentukan oleh sesuatu DAN sesuatu yang lain DAN sesuatu yang lain ...
Tapi, ekspresi reguler melakukan memiliki OR operator, jadi hanya berlaku teorema DeMorgan, dan menulis regex yang cocok valid password.
apapun dengan kurang dari 8 karakter ATAU apapun tanpa angka ATAU apapun tanpa huruf besar ATAU apapun tanpa karakter khusus
Begitu:
Jika ada yang cocok, maka itu adalah kata sandi yang tidak valid .
sumber
|.{9,}
. 1 untuk konsepJawabannya adalah tidak menggunakan ekspresi reguler. Ini adalah set dan penghitungan.
Ekspresi reguler adalah tentang keteraturan.
Dalam kehidupan Anda sebagai programmer, Anda akan diminta untuk melakukan banyak hal yang tidak masuk akal. Belajar untuk menggali lebih dalam. Pelajari saat pertanyaannya salah.
Pertanyaannya (jika disebutkan ekspresi reguler) salah.
Pseudocode (akhir-akhir ini beralih di antara terlalu banyak bahasa):
Taruhan Anda membaca dan memahami kode di atas hampir secara instan. Taruhan Anda membutuhkan waktu lebih lama dengan regex, dan kurang yakin itu benar. Memperpanjang regex berisiko. Perluas segera di atas, apalagi.
Perhatikan juga pertanyaannya diutarakan secara tidak tepat. Apakah set karakter ASCII atau Unicode, atau ?? Dugaan saya dari membaca pertanyaan tersebut adalah bahwa setidaknya satu karakter huruf kecil diasumsikan. Jadi saya pikir aturan terakhir yang diasumsikan harus:
(Mengubah topi menjadi berfokus pada keamanan, ini adalah aturan yang sangat mengganggu / tidak berguna.)
Belajar mengetahui kapan pertanyaannya salah secara besar-besaran lebih penting daripada jawaban yang cerdik. Jawaban cerdas atas pertanyaan yang salah hampir selalu salah.
sumber
Sebagai contoh bagaimana hal ini dapat dilakukan dengan regex yang dapat dibaca / dipelihara.
Untuk regex yang lebih panjang, Anda harus selalu menggunakan
RegexOptions.IgnorePatternWhitespace
spasi kosong dan komentar dalam ekspresi agar lebih mudah dibaca.sumber
lookahead assertion
sebagai "dan" untuk menutupi seluruh batasan dalam satu regex. Berfungsi untuk lebih banyak batasan dan dapat dengan mudah dibuat jika beberapa batasan harus diaktifkan / dinonaktifkan oleh konfigurasi.Jika Anda hanya membutuhkan satu huruf besar dan karakter khusus maka ini seharusnya berfungsi:
sumber
AAaaaaaaa#
tidak OK menurut ungkapan iniEkspresi reguler Anda sedang mencari adalah:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*\[\]"\';:_\-<>\., =\+\/\\]).{8,}$/u
.Contoh dan uji: http://regexr.com/3fhr4
sumber
.
sebelum{8,}
menjadi[^\s]
.Pertanyaan ini mulai viral dan banyak saran menarik bermunculan.
Ya, menulis dengan tangan itu sulit. Jadi solusi yang lebih mudah adalah dengan menggunakan template. Meskipun regex yang dihasilkan mungkin tidak optimal, akan lebih mudah untuk mempertahankan dan / atau mengubah, dan pengguna akan memiliki kontrol yang lebih baik atas hasilnya. Ada kemungkinan saya melewatkan sesuatu, jadi kritik yang membangun akan membantu.
Tautan ini mungkin menarik: cocokkan setidaknya 2 digit 2 huruf dalam urutan apa pun dalam string , Bahasa Ekspresi Reguler , Grup penangkap
Saya menggunakan template ini
(?=(?:.*?({type})){({count})})
berdasarkan semua regex yang saya lihat di SO. Langkah selanjutnya adalah mengganti pola yang dibutuhkan (number
,special character
...) dan menambahkan konfigurasi panjang.Saya telah membuat kelas kecil untuk membuat regex PasswordRegexGenerator.cs Contoh:
sumber
Anda dapat menggunakan kelas di bawah ini untuk validasi:
dimana 6 dan 20 adalah panjang minimum dan maksimum untuk kata sandi.
sumber
(?>{8,})
(?<=...)
(?<=\p{Lu}.*)
(?<=\W.*)
(?<=\w.*)
Jumlahkan:
(?>.{8,})(?<=\p{Lu}.*)(?<=\W.*)(?<=\w.*)
sumber
Yang terbaik adalah tidak menggunakan regex untuk semuanya. Persyaratan tersebut sangat ringan. Pada operasi string berdasarkan CPU untuk memeriksa kriteria / validasi jauh lebih murah dan lebih cepat daripada regex!
sumber
sumber