Saya mencoba membuat tes Regex di JavaScript yang akan menguji string berisi salah satu dari karakter ini:
!$%^&*()_+|~-=`{}[]:";'<>?,./
Info Lebih Lanjut Jika Anda Tertarik :)
Ini untuk aplikasi perubahan kata sandi yang cukup keren yang sedang saya kerjakan. Jika Anda tertarik, inilah kode lainnya.
Saya memiliki tabel yang mencantumkan persyaratan kata sandi dan saat pengguna akhir mengetik kata sandi baru, itu akan menguji array Regexes dan memberi tanda centang di baris tabel yang sesuai jika ... memeriksa :) Saya hanya perlu menambahkan yang ini sebagai ganti item ke-4 dalam validation
array.
var validate = function(password){
valid = true;
var validation = [
RegExp(/[a-z]/).test(password), RegExp(/[A-Z]/).test(password), RegExp(/\d/).test(password),
RegExp(/\W|_/).test(password), !RegExp(/\s/).test(password), !RegExp("12345678").test(password),
!RegExp($('#txtUsername').val()).test(password), !RegExp("cisco").test(password),
!RegExp(/([a-z]|[0-9])\1\1\1/).test(password), (password.length > 7)
]
$.each(validation, function(i){
if(this)
$('.form table tr').eq(i+1).attr('class', 'check');
else{
$('.form table tr').eq(i+1).attr('class', '');
valid = false
}
});
return(valid);
}
Ya, ada juga validasi sisi server yang sesuai!
javascript
jquery
regex
pixelbobby
sumber
sumber
.addClass("check")
dan.removeClass("check")
? Dan melihatif (someBoolean == true)
kode selalu membuatku ngeri. Lakukan sajaif (someBoolean)
. Atau, lebih baik lagi, lakukan saja$(".form table tr").eq(i+1).toggleClass("check", !!this); valid = valid && !!this;
.Jawaban:
Ekspresi reguler untuk ini sangat sederhana. Cukup gunakan kelas karakter. Tanda hubung adalah karakter khusus dalam kelas karakter, jadi harus menjadi yang pertama:
/[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/
Anda juga harus melepaskan karakter meta ekspresi reguler lainnya.
Sunting: Tanda hubung itu khusus karena dapat digunakan untuk mewakili berbagai karakter. Kelas karakter yang sama ini dapat disederhanakan dengan rentang seperti ini:
/[$-/:-?{-~!"^_`\[\]]/
Ada tiga rentang. '$' to '/', ':' to '?', dan '{' to '~'. string karakter terakhir tidak dapat direpresentasikan secara lebih sederhana dengan range:! "^ _` [].
Gunakan tabel ACSII untuk menemukan rentang kelas karakter.
sumber
\Q
dan\E
jangan bekerja di mesin JS RegExp :(/^\Q.\E$/.test('Q+E'); // true
Cara paling sederhana dan terpendek untuk melakukannya:
Penjelasan
[^...]
Cocok dengan satu karakter yang tidak ada dalam daftar di bawah\p{L}
=> cocok dengan semua jenis huruf dari bahasa apapun\d
=> cocok dengan angka nol sampai sembilan\s
=> cocok dengan semua jenis karakter yang tidak terlihat@#
=>@
dan#
karakterJangan lupa untuk meneruskan
u
flag (unicode).sumber
^
dibutuhkan saat kita menggunakan\w
dan\s
dalam huruf kecil.w
atau di luars
, dan karena keduanya tidak benar-benar berpotongan, itu hanya memungkinkan melalui semua karakter? (Jadi tidak menyaring apa pun.)/[\W\S]/
) membiarkan semuanya masuk. Representasi yang lebih akurat tentang apa yang saya yakini akan dicapai oleh Amir[^\w\s]
. Pada yang pertama, ekspresi reguler mengatakan "cocokkan apa pun yang bukan alfanumerik ATAU yang bukan spasi putih", yang seperti yang Anda sebutkan, mari semuanya berjalan karena karakter alfanumerik bukan spasi putih dan sebaliknya. Yang terakhir mengatakan "cocokkan apa pun yang bukan alfanumerik DAN yang bukan spasi". Tentu saja, pengecualian berlaku jika karakter beraksen (sukaÀ
) dicocokkan dengan[^\w\s]
.Menjawab
Penjelasan
Ini membuat kelas karakter menghapus karakter kata, karakter spasi, dan menambahkan kembali karakter garis bawah (karena garis bawah adalah karakter "kata"). Yang tersisa hanyalah karakter khusus. Huruf kapital mewakili negasi dari huruf kecil.
\W
akan memilih semua karakter non "kata" yang setara dengan[^a-zA-Z0-9_]
\S
akan memilih semua karakter non "spasi putih" yang setara dengan[ \t\n\r\f\v]
_
akan memilih "_" karena kita meniadakannya saat menggunakan\W
dan perlu menambahkannya kembalisumber
// The string must contain at least one special character, escaping reserved RegEx characters to avoid conflict const hasSpecial = password => { const specialReg = new RegExp( '^(?=.*[!@#$%^&*"\\[\\]\\{\\}<>/\\(\\)=\\\\\\-_´+`~\\:;,\\.€\\|])', ); return specialReg.test(password); };
sumber
RegExp
konstruktor saat Anda bisa menggunakan literal regex. Jauh lebih sedikit pekerjaan melarikan diri (yang sebagian besar tidak perlu), dan itu lebih efisien juga.Cara sederhana untuk mencapai ini adalah himpunan negatif [^ \ w \ s]. Ini pada dasarnya menangkap:
Untuk beberapa alasan [\ W \ S] tidak bekerja dengan cara yang sama, ia tidak melakukan pemfilteran apa pun. Komentar Zael di salah satu jawaban memberikan penjelasan.
sumber
/[^\w\s]/.test('é') # true
,/[^\w\s]/.test('_') # false
.Ganti semua latters dari bahasa apa pun di 'A', dan jika Anda ingin, misalnya, semua angka menjadi 0:
return str.replace(/[^\s!-@[-`{-~]/g, "A").replace(/\d/g, "0");
sumber