我必须同意艾伦的观点。如果现有的正则表达式如此复杂,为什么要尝试仅用一个正则表达式来完成它呢?
只需将其分解为易于理解的简单步骤即可。你已经这么做了。
现在编写 4 个正则表达式来验证您的部分,向 4 个正则表达式添加基本逻辑并测量字符串的长度。完毕。
你更愿意调试哪个,这个:
(?=^(?:[^A-Z]*[A-Z]){2})(?=^(?:[^a-z]*[a-z]){2})(?=^(?:\D*\d){2})(?=^(?:\w*\W){2})^[A-Za-z\d\W]{8,}$
(顺便说一句,这不起作用......)
or this:
function valid_pass($candidate) {
$r1='/[A-Z]/'; //Uppercase
$r2='/[a-z]/'; //lowercase
$r3='/[!@#$%^&*()\-_=+{};:,<.>]/'; // whatever you mean by 'special char'
$r4='/[0-9]/'; //numbers
if(preg_match_all($r1,$candidate, $o)<2) return FALSE;
if(preg_match_all($r2,$candidate, $o)<2) return FALSE;
if(preg_match_all($r3,$candidate, $o)<2) return FALSE;
if(preg_match_all($r4,$candidate, $o)<2) return FALSE;
if(strlen($candidate)<8) return FALSE;
return TRUE;
}
为什么人们觉得他们必须编写一个没人能理解的正则表达式,这样他们才能一次性完成,这超出了我的理解......
好吧,如果你真的想要一个正则表达式,请了解前瞻验证您的规则。
这个怪物一口气完成了你的要求:
^ # start of line
(?=(?:.*[A-Z]){2,}) # 2 upper case letters
(?=(?:.*[a-z]){2,}) # 2 lower case letters
(?=(?:.*\d){2,}) # 2 digits
(?=(?:.*[!@#$%^&*()\-_=+{};:,<.>]){2,}) # 2 special characters
(.{8,}) # length 8 or more
$ # EOL
Demo