Answers:
试试这个:
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\S+$).{8,}$
说明:
^ # start-of-string
(?=.*[0-9]) # a digit must occur at least once
(?=.*[a-z]) # a lower case letter must occur at least once
(?=.*[A-Z]) # an upper case letter must occur at least once
(?=.*[@#$%^&+=]) # a special character must occur at least once
(?=\S+$) # no whitespace allowed in the entire string
.{8,} # anything, at least eight places though
$ # end-of-string
由于每个规则都是独立的“模块”,因此添加,修改或删除单个规则很容易。
所述(?=.*[xyz])
构建体吃整个字符串(.*
)和回溯到第一次出现在那里[xyz]
可以匹配。如果[xyz]
找到则成功,否则失败。
替代方法是使用勉强的限定符:(?=.*?[xyz])
。对于密码检查,这几乎没有什么区别,对于更长的字符串,这可能是更有效的变体。
当然,最有效的变体(但最难阅读和维护,因此最容易出错)(?=[^xyz]*[xyz])
。对于这种长度的正则表达式,并为此目的,我不建议这样做,因为它没有实际好处。
\\s
。这是Java要求,而不是正则表达式要求。
(?=...)
模式,使其与其余表达式的设置匹配
(?=\S+$)
)还是“不包含空格字符”((?!.*\s)
)是一个优先事项。使用更好的东西。:)
使用正则表达式的简单示例
public class passwordvalidation {
public static void main(String[] args) {
String passwd = "aaZZa44@";
String pattern = "(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}";
System.out.println(passwd.matches(pattern));
}
}
说明:
(?=.*[0-9])
一个数字必须至少出现一次(?=.*[a-z])
小写字母必须至少出现一次(?=.*[A-Z])
大写字母必须至少出现一次(?=.*[@#$%^&+=])
一个特殊字符必须至少出现一次(?=\\S+$)
整个字符串中不允许有空格.{8,}
至少8个字符先前给出的所有答案均使用相同(正确)的技术针对每个要求使用单独的前瞻。但是它们取决于实际将使用密码的后端,存在一些效率低下和潜在的大量错误。
我将从接受的答案中使用正则表达式开始:
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\S+$).{8,}$
首先,由于Java支持\A
,因此\z
我更喜欢使用它们来确保整个字符串独立于进行验证Pattern.MULTILINE
。这不会影响性能,但可以避免在回收正则表达式时出错。
\A(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\S+$).{8,}\z
通过将可变量词{8,}
放在\S
限制所允许字符的速记上,可以一次使用全部,从而一次性检查口令是否不包含空格并检查其最小长度。
\A(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])\S{8,}\z
如果提供的密码确实包含空格,则将执行所有检查,仅是使最终检查在该空格上失败。可以通过将所有点替换为来避免这种情况\S
:
\A(?=\S*[0-9])(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[@#$%^&+=])\S{8,}\z
仅当您确实要允许任何字符时才应使用点。否则,使用(否定的)字符类将您的正则表达式限制为仅真正允许的字符。尽管在这种情况下差别不大,但是在其他更合适的情况下不使用点是一个很好的习惯。我看到太多灾难性回溯的情况,因为开发人员太懒了,无法使用比点更合适的东西。
由于初始测试很有可能会在密码的前半部分找到合适的字符,因此惰性量词会更有效:
\A(?=\S*?[0-9])(?=\S*?[a-z])(?=\S*?[A-Z])(?=\S*?[@#$%^&+=])\S{8,}\z
但是现在对于真正重要的问题:没有一个答案提到以下事实:原始问题似乎是由以ASCII思维的人写的。但是在Java中,字符串是Unicode。密码中允许使用非ASCII字符吗?如果是这样,则仅允许ASCII空格,或者应排除所有Unicode空格。
默认情况下,\s
仅匹配ASCII空格,因此其逆值\S
匹配所有Unicode字符(是否有空格)和所有非空格ASCII字符。如果允许Unicode字符但不允许Unicode空格,则UNICODE_CHARACTER_CLASS
可以指定该标志以\S
排除Unicode空格。如果不允许[\x21-\x7E]
使用Unicode字符,则可以使用而不是\S
匹配所有非空格或控制字符的ASCII字符。
这带来了下一个潜在的问题:我们是否要允许控制字符?编写适当的正则表达式的第一步是准确指定要匹配的内容和不匹配的内容。唯一100%从技术上正确的答案是问题中的密码规范不明确,因为它没有说明是否允许某些范围的字符(如控制字符或非ASCII字符)。
您不应该使用过于复杂的Regex(如果可以避免使用它们),因为它们是
尽管使用许多小的正则表达式可能会降低性能开销,但上述几点很容易实现。
我会这样实现:
bool matchesPolicy(pwd) {
if (pwd.length < 8) return false;
if (not pwd =~ /[0-9]/) return false;
if (not pwd =~ /[a-z]/) return false;
if (not pwd =~ /[A-Z]/) return false;
if (not pwd =~ /[%@$^]/) return false;
if (pwd =~ /\s/) return false;
return true;
}
对于任何对每种字符的最低要求感兴趣的人,我建议对Tomalak可接受的答案进行以下扩展:
^(?=(.*[0-9]){%d,})(?=(.*[a-z]){%d,})(?=(.*[A-Z]){%d,})(?=(.*[^0-9a-zA-Z]){%d,})(?=\S+$).{%d,}$
请注意,这是一个格式化字符串,而不是最终的正则表达式模式。只需用最少的出现次数替换%d即可:数字,小写字母,大写字母,非数字/字符和整个密码(分别)。出现最大的可能性不大(除非您希望最大为0,有效地拒绝任何此类字符),但也可以轻松添加这些字符。注意每种类型周围的额外分组,以便最小/最大约束允许非连续匹配。这为系统创造了奇迹,我们可以集中配置所需的每种类型的字符数量,然后让网站以及两个不同的移动平台获取该信息,以便根据上述格式字符串构造正则表达式模式。
带参数的Java方法准备就绪
只需复制并粘贴并设置所需的参数即可。
如果您不需要模块,只需对其注释或添加“ if”(如我对特殊字符所做的操作)即可
//______________________________________________________________________________
/**
* Validation Password */
//______________________________________________________________________________
private static boolean validation_Password(final String PASSWORD_Arg) {
boolean result = false;
try {
if (PASSWORD_Arg!=null) {
//_________________________
//Parameteres
final String MIN_LENGHT="8";
final String MAX_LENGHT="20";
final boolean SPECIAL_CHAR_NEEDED=true;
//_________________________
//Modules
final String ONE_DIGIT = "(?=.*[0-9])"; //(?=.*[0-9]) a digit must occur at least once
final String LOWER_CASE = "(?=.*[a-z])"; //(?=.*[a-z]) a lower case letter must occur at least once
final String UPPER_CASE = "(?=.*[A-Z])"; //(?=.*[A-Z]) an upper case letter must occur at least once
final String NO_SPACE = "(?=\\S+$)"; //(?=\\S+$) no whitespace allowed in the entire string
//final String MIN_CHAR = ".{" + MIN_LENGHT + ",}"; //.{8,} at least 8 characters
final String MIN_MAX_CHAR = ".{" + MIN_LENGHT + "," + MAX_LENGHT + "}"; //.{5,10} represents minimum of 5 characters and maximum of 10 characters
final String SPECIAL_CHAR;
if (SPECIAL_CHAR_NEEDED==true) SPECIAL_CHAR= "(?=.*[@#$%^&+=])"; //(?=.*[@#$%^&+=]) a special character must occur at least once
else SPECIAL_CHAR="";
//_________________________
//Pattern
//String pattern = "(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}";
final String PATTERN = ONE_DIGIT + LOWER_CASE + UPPER_CASE + SPECIAL_CHAR + NO_SPACE + MIN_MAX_CHAR;
//_________________________
result = PASSWORD_Arg.matches(PATTERN);
//_________________________
}
} catch (Exception ex) {
result=false;
}
return result;
}
使用功能强大的API的Passay库。
简单的一个
(“ ^(?=。* [0-9])(?=。* [az])(?=。* [AZ])(?=。* [\\ W _])[\\ S] {8 ,10} $“)
(?=任意值)->表示在所有输入字符串中都为正,并确保已写入此条件。sample(?=。* [0-9])->表示确保在所有字符串中写入一位数字。如果未写,则返回false 。
(?!一切)->(反之亦然)意味着如果条件被写入,否定的前瞻性返回false。
close意义^(条件)(条件)(条件)(条件)[\ S] {8,10} $
String s=pwd;
int n=0;
for(int i=0;i<s.length();i++)
{
if((Character.isDigit(s.charAt(i))))
{
n=5;
break;
}
else
{
}
}
for(int i=0;i<s.length();i++)
{
if((Character.isLetter(s.charAt(i))))
{
n+=5;
break;
}
else
{
}
}
if(n==10)
{
out.print("Password format correct <b>Accepted</b><br>");
}
else
{
out.print("Password must be alphanumeric <b>Declined</b><br>");
}
说明:
您也可以这样做。
public boolean isPasswordValid(String password) {
String regExpn =
"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}$";
CharSequence inputStr = password;
Pattern pattern = Pattern.compile(regExpn,Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(inputStr);
if(matcher.matches())
return true;
else
return false;
}
强密码示例代码块:
(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9])(?=\\S+$).{6,18}
正则表达式是-
^(?:(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*)[^\s]{8,}$