İstediğiniz:
/^(?=.{6,12}$)...
Ne yapıyoruz diyor: Bana tarafından takip edilir bir dizi karakter bulabilirsiniz:
- 6-12 karakter
- 2 basamak takip eder içeren bir diğer karakter dizisi
- 2 büyük harf tarafından takip edilir karakterlerin başka dizisi
- 2 küçük harflerle takip karakterlerin başka dizisi
Ve bu karakterler bir başka sırası ile takip edilir. 00AAaa ve başka bir 30 karakterin ardından 30 karakter geçecek çünkü maksimum uzunluğu çalışmıyor neden budur.
Ayrıca ne yaptığınızı iki sayı together zorluyor. Dizede herhangi bir en az iki sayı gerektiren ama daha az sıkı olması için:
/^(?=.{6,12}$)(?=(.*?\d){2})(?=(.*?[A-Z]){2})(?=(.*?[a-z]){2})/
Son olarak ben açgözlü olmayan ifadeleri kullanıyorum dikkat edeceğiz (.*?
). Bu bir lot yararlar ve doğrulama bu tür genellikle kullanmanız gereken ne için önlemek olacaktır. Arasındaki fark:
(.*\d){2}
ve
(.*?\d){2}
Is that the first will grab all the characters with .*
ve then look for a digit. It won't find one because it will be at the end of the string so it will backtrack one characters ve then look for a digit. If it's not a digit it will keep backtracking until it finds one. After it does it will match that whole expression a second time, which will trigger even more backtracking.
İşte greedy wildcards demek.
The second version will pass on zero characters to .*?
ve look for a digit. If it's not a digit .*?
will grab another characters ve then look for a digit ve so on. Particularly on long search strings this can be orders of magnitude faster. On a short password it almost certainly won't make a difference but it's a good habit to get into of knowing how the regex matcher works ve writing the best regex you can.
Söyleniyor, bu muhtemelen kendi iyiliği için çok zeki olmanın bir örneğidir. Bir parola, bu koşulları sağlamayan olarak reddedilirse, nasıl düzeltmek için ne hakkında kullanıcıya geri bildirim vermek için başarısız olduğunu belirliyorsunuz? Bir program çözelti, uygulamada, daha iyidir.