我需要密码规则.以下是规则.
密码必须遵循以下准则:
当用户指定不符合上述规则的密码时,请返回以下消息:
密码长度必须至少为8个字符,并包含以下4个选项中的3个:
请帮我得到一个正则表达式来处理上述条件.
我感谢你的帮助.以下是我的要求的解决方案
if(password.matches("^(?=.*[0-9]).{1,}$")){
validCount++;
}
if(password.matches("^(?=.*[a-z]).{1,}$")){
validCount++;
}
if(password.matches("^(?=.*[A-Z]).{1,}$")){
validCount++;
}
if(password.matches("^(?=.*[@#$%^&+=]).{1,}$")){
validCount++;
}
return validCount >= 3 ? true : false;
Run Code Online (Sandbox Code Playgroud)
谢谢,拉姆基
buc*_*ley 11
这就是,如果你想要一个优雅的正则表达式,尽可能接近你
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&'])[^ ]{8,}$
Run Code Online (Sandbox Code Playgroud)
基本思想是使用一种称为"积极前瞻"的技术:
(?=.*PutHereWhatYouWantToAllow)
Run Code Online (Sandbox Code Playgroud)
你的额外要求中有3个是不容易用正则表达式来解决的,因为你基本上不能算它们.你可以写出上面正则表达式的必要排列(告诉我它是否没有意义),但这会产生一个很长的正则表达式.您可以做的是在代码中写出排列,以便正则表达式保持可维护性,因为您不是按字面意思重复模式.
如果你告诉我你的语言(C#?),我会有机会,因为这是一个很好的挑战.
更新1
这里的正则表达式将满足至少3个您的要求(也允许4个),只是为了挑战它.不要在生产中使用它,而是使用注释中提到的单个正则表达式的语言循环.
^((α=.[az]. [AZ].[\ d])|(α=. [az].[\ d]. [AZ])|(α=.[AZ]. [az].[\ d])|(?=. [AZ].[\ d]. [az])|(?=.[\ d]. [az].[AZ])|(?=. [\ d] .[AZ]. [az])|(?=.[az]. [AZ].[!@#$%^&'])|(?=. [az].[!@#$%^& ']. [AZ])|(?=.[AZ]. [az].[!@#$%^&'])|(?=. [AZ].[!@#$%^&'] . [az])|(?=.[!@#$%^&']. [az].[AZ])|(?=. [!@#$%^&'].[AZ]. [ az])|(?=.[az]. [\ d].[!@#$%^&'])|(?=. [az].[!@#$%^&']. [\ d])|(?=.[\ d]. [az].[!@#$%^&'])|(?=. [\ d].[!@#$%^&']. [ az])|(?=.[!@#$%^&']. [az].[\ d])|(?=. [!@#$%^&'].[\ d]. [ az])|(?=.[AZ]. [\ d].[!@#$%^&'])|(?=. [AZ].[!@#$%^&']. [\ d])|(?=.[\ d]. [AZ].[!@#$%^&'])|(?=. [\ d].[!@#$%^&']. [ AZ])|(?=.[!@#$%^&']. [AZ].[\ d])|(?=. [!@#$%^&'].[\ d]. [ AZ]))[^] {8,} $
更新2
这是采用java的方法
从我看到的评论中你正在测试如下
我不认为你在这里走在正确的轨道上.如果所有字符都是小写的,则小写仅报告成功,而不只是一个.其余的相同.
这些是4个单独的正则表达式,其中至少3个应报告匹配
[a-z]
[A-Z]
\d
[!@#$%^&']
Run Code Online (Sandbox Code Playgroud)
以下是密码不应包含空格的测试
^[^ ]*$
Run Code Online (Sandbox Code Playgroud)
测试至少8个字符
.{8,}
Run Code Online (Sandbox Code Playgroud)
所以我分开了要求而不是将它们结合起来.这应该使代码更易读,特别是如果以正则表达式开头.