用于密码验证的regexpjava
我正在为密码验证创建一个regexp,作为配置参数在Java应用程序中使用 regexp是:用于密码验证的regexpjava,java,regex,Java,Regex,我正在为密码验证创建一个regexp,作为配置参数在Java应用程序中使用 regexp是: ^.*(?=.{8,})(?=..*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$ 密码策略是: 至少8个字符 包含至少一个数字 至少包含一个较低的alpha字符和一个较高的alpha字符 在一组特殊字符中至少包含一个字符(@#%$^等) 不包含空格、制表符等 我只遗漏了第五点。我无法让regexp检查空间、制表符、回车等 有人能帮我吗?试试
^.*(?=.{8,})(?=..*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
密码策略是:
- 至少8个字符
- 包含至少一个数字
- 至少包含一个较低的alpha字符和一个较高的alpha字符
- 在一组特殊字符中至少包含一个字符(
等)@#%$^
- 不包含空格、制表符等
^(?=.*[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])
。对于这种长度的正则表达式,出于这个目的,我不建议这样做,因为它没有真正的好处。使用正则表达式的简单示例
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,}
- 密码长度应至少为八(8)个字符,系统可以支持该密码
- 密码必须包含至少两(2)组字符:字母、数字和特殊字符
^.*(?=.{8,})(?=.*\d)(?=.*[a-zA-Z])|(?=.{8,})(?=.*\d)(?=.*[!@#$%^&])|(?=.{8,})(?=.*[a-zA-Z])(?=.*[!@#$%^&]).*$
我对它进行了测试,它可以工作我认为这也可以(作为一种更简单的模式):
前面给出的所有答案都使用相同的(正确的)技术对每个需求使用单独的前瞻。但是,根据实际使用密码的后端,它们包含一些低效率和潜在的巨大错误 我将从公认答案的正则表达式开始:
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\S+$).{8,}$
^(?=(.*[0-9]){%d,})(?=(.*[a-z]){%d,})(?=(.*[A-Z]){%d,})(?=(.*[^0-9a-zA-Z]){%d,})(?=\S+$).{%d,}$
首先,由于Java支持\A
和\z
,我更喜欢使用它们来确保验证整个字符串,独立于模式。这不会影响性能,但可以避免在回收正则表达式时出现错误
\A(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\S+$).{8,}\z
检查密码是否不包含空格以及检查密码的最小长度可以通过一次使用all来完成,方法是将变量量词{8,}
放在限制允许字符的速记\S
上:
\A(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])\S{8,}\z
@SuppressWarnings({"regexp", "RegExpUnexpectedAnchor", "RegExpRedundantEscape"})
String PASSWORD_SPECIAL_CHARS = "@#$%^`<>&+=\"!ºª·#~%&'¿¡€,:;*/+-.=_\\[\\]\\(\\)\\|\\_\\?\\\\";
int PASSWORD_MIN_SIZE = 8;
String PASSWORD_REGEXP = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[" + PASSWORD_SPECIAL_CHARS + "])(?=\\S+$).{"+PASSWORD_MIN_SIZE+",}$";
如果提供的密码中确实包含空格,则将执行所有检查,但最终检查失败。可以通过将所有点替换为\S
:
\A(?=\S*[0-9])(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[@#$%^&+=])\S{8,}\z
只有当您确实希望允许任何字符时,才应使用点。否则,使用(否定的)字符类将正则表达式限制为仅允许使用的字符。虽然在这种情况下没有什么区别,但这是一个很好的习惯。我看到太多的例子,因为开发人员太懒了,没有使用比dot更合适的东西
由于初始测试很有可能在密码的前半部分找到合适的字符,因此惰性量词可能更有效:
\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\u CHARACTER\u CLASS
标志,使\S
排除Unicode空格。如果不允许使用Unicode字符,则可以使用[\x21-\x7E]
而不是\S
来匹配所有非空格或控制字符的ASCII字符
这就引出了下一个潜在问题:我们是否希望允许控制字符?编写一个合适的正则表达式的第一步是准确地指定要匹配的内容和不匹配的内容。唯一100%技术上正确的答案是,问题中的密码规范不明确,因为它没有说明是否允许某些字符范围,如控制字符或非ASCII字符。您不应该使用过于复杂的正则表达式(如果可以避免),因为它们是
- 难以阅读(至少对每个人来说,除了你自己)
- 难以扩展
- 难以调试
尽管使用许多小型正则表达式可能会带来较小的性能开销,但上面的几点很容易就超过了这一点
我想这样做:
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;
}
bool匹配策略(pwd){
如果(pwd.length<8)返回false;
if(非pwd=~/[0-9]/)返回false;
if(非pwd=~/[a-z]/)返回false;
if(非pwd=~/[A-Z]/)返回false;
if(非pwd=~/[%@$^]/)返回false;
如果(pwd=~/\s/)返回false;
返回true;
}
对于
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>");
}
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=\S+$).*[A-Za-z0-9].{8,}$
//______________________________________________________________________________
/**
* 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;
}
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,}$
@SuppressWarnings({"regexp", "RegExpUnexpectedAnchor", "RegExpRedundantEscape"})
String PASSWORD_SPECIAL_CHARS = "@#$%^`<>&+=\"!ºª·#~%&'¿¡€,:;*/+-.=_\\[\\]\\(\\)\\|\\_\\?\\\\";
int PASSWORD_MIN_SIZE = 8;
String PASSWORD_REGEXP = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[" + PASSWORD_SPECIAL_CHARS + "])(?=\\S+$).{"+PASSWORD_MIN_SIZE+",}$";