我在网上看到了下面的正则表达式。
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$
它仅在以下情况下验证:
* contain at least (1) upper case letter
* contain at least (1) lower case letter
* contain at least (1) number or special character
* contain at least (8) characters in length
我想知道如何将这个正则表达式转换为
* contain at least (2) upper case letter
* contain at least (2) lower case letter
* contain at least (2) digits
* contain at least (2) special character
* contain at least (8) characters in length
好吧,如果它至少包含2个大写,小写,数字和特殊字符,那么我就不需要8个字符的长度。
特殊字符包括:
`~!@#$%^&*()_-+=[]|{};:'".,/<>?
发布于 2010-04-14 22:06:11
适应该正则表达式的最好方法是丢弃它,转而编写一些代码。所需的正则表达式将是如此冗长和复杂,以至于您在编写它两个小时后无法阅读它。等效的PHP代码会很单调乏味,但至少您能够理解您所编写的内容。
顺便说一句,这不是对你的猛烈抨击。正则表达式在大多数情况下只是勉强适用于密码强度验证,但是您的需求比通常情况下更复杂,这是不值得的。另外,你发布的正则表达式也是垃圾。永远不要相信你在web上发现的那些正则表达式。或者任何代码,就这点而言。或者,见鬼,什么都行。:-/
发布于 2010-04-15 00:25:34
我不得不同意艾伦的观点。如果现有的正则表达式如此复杂,为什么还要在一个正则表达式中完成它呢?
只要把它分解成容易接近的简单步骤即可。您已经这样做了。
现在编写4正则表达式来验证您的部件,向4正则表达式添加基本逻辑并测量字符串的长度。好了。
你更愿意调试哪一个,这个:
(?=^(?:[^A-Z]*[A-Z]){2})(?=^(?:[^a-z]*[a-z]){2})(?=^(?:\D*\d){2})(?=^(?:\w*\W){2})^[A-Za-z\d\W]{8,}$
(顺便说一下,它不能工作...)
或者这样:
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;
}
为什么人们觉得他们必须编写一个没有人能理解的正则表达式,这样他们就可以一口气完成它,这超出了我的理解……
好的,好的--如果您真的想要一个正则表达式,那么学习lookaheads来验证您的规则。
这个怪物一下子就完成了你要求的事情:
^ # 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
发布于 2010-04-14 22:19:00
如果你真的想使用正则表达式,试试这个:
(?=^(?:[^A-Z]*[A-Z]){2})(?=^(?:[^a-z]*[a-z]){2})(?=^(?:\D*\d){2})(?=^(?:\w*\W){2})^[A-Za-z\d\W]{8,}$
一些解释:
(?=^(?:[^A-Z]*[A-Z]){2})
测试两次重复的letter(?=^(?:[^a-z]*[a-z]){2})
,[^A-Z]*[A-Z]
是除大写字母后跟一个大写letter(?=^(?:[^a-z]*[a-z]){2})
之外的一个由零个或多个字符组成的序列(与上面的小写letters)(?=^(?:\D*\d){2})
相同(对于非单词字符,与上面的相同,但您可以使用任何特殊字符来更改\W
,只要您want)^[A-Za-z\d\W]{8,}$
测试的整个字符串的长度仅由所有其他字符类的联合字符组成)。https://stackoverflow.com/questions/2637896
复制相似问题