我正在编写正则表达式以验证密码。
下面是我要介绍的密码策略:
密码只能包含数字,字母和特殊字符。
密码的最小长度为10,密码的最大长度为32。
同一字符不应连续出现10次以上。
第一个字符不能为特殊字符。
至少需要2个字符类。(字母,数字或特殊字符)
允许使用特殊字符-!#+,-./:=@_
除第五点外,将满足前四个条件的正则表达式:
^(?!.*(.)\1{7})[A-Za-z0-9][\w!#+,./:=@-]{7,23}
我如何在Java中一起验证所有策略?
答案 0 :(得分:1)
做到这一点的最好方法是不使用正则表达式。
具有单独条件的子例程更易于阅读和维护:
sub is_password_valid {
my ($pw) = @_;
$pw =~ m{[^a-zA-Z0-9!\#+,\-./:=\@_]}
and return 0;
length($pw) >= 10 && length($pw) <= 32
or return 0;
$pw =~ /(.)\1{9}/s
and return 0;
$pw =~ /^[a-zA-Z0-9]/
or return 0;
($pw =~ /[a-zA-Z]/ + $pw =~ /[0-9]/ + $pw =~ /[^a-zA-Z0-9]/) >= 2
or return 0;
return 1;
}
或者,因为这基本上只是一个大条件:
sub is_password_valid {
my ($pw) = @_;
return
$pw !~ m{[^a-zA-Z0-9!\#+,\-./:=\@_]} &&
length($pw) >= 10 &&
length($pw) <= 32 &&
$pw !~ /(.)\1{9}/s &&
$pw =~ /^[a-zA-Z0-9]/ &&
($pw =~ /[a-zA-Z]/ + $pw =~ /[0-9]/ + $pw =~ /[^a-zA-Z0-9]/) >= 2
;
}
如果这不是用于家庭作业的玩具验证器,则应更改您的要求。使用正则表达式“验证”密码没有意义。
您应该要求一个最小长度,最大长度要大得多(大约255个字符),并且不限制所使用的字符集。
如果您想防止使用弱密码,请检查haveibeenpwned并让密码破解者(例如hashcat)解决。
答案 1 :(得分:0)
print "Enter your password please: ";
$p=<STDIN>;chomp $p;
if ( $p =~ /(?!^[\s!#+,-./:=@_])(?=^[\w!#+,-./:=@]{10,32}$)(?=.*[A-Za-z])(?=.*[0-9])(?=.*[!#+,-./:=@_])(?!.*(.)\1{9,}).{10,32}/ ) {print "Welcome"; f=1}
答案 2 :(得分:0)
相反,创建相反的子目录可以返回零个或多个错误消息,而不是创建返回有效密码为true的子目录。
当然,这样做的好处是可以将错误消息呈现给用户,以准确指出违反了哪些规则。
addOne = (data) => {
let sum = 0, digit = data.length - 1
data.forEach(n => sum += n * (10 ** digit--))
return (sum + 1).toString().split("")
}
console.log(addOne([1,8,9]))
console.log(addOne([1,2,3,9,1]))
console.log(addOne([5,7,9,9]))