不要试图在一个正则表达式中完成所有操作。 进行两次不同的检查。
假设您正在使用 Perl(因为您没有指定语言):
$valid_pw =
( $pw =~ /^((a-z | A-Z |\d)(a-z|A-Z|[<+$*])(a-z|[<+$*]|\d)(A-Z|[<+$*]|\d)).*$/ ) &&
( $pw !~ /\|;{}/ );
您是说“如果 PW 匹配所有包含规则,并且 PW 不匹配任何排除字符,则密码有效。”
看看这比上面@Jerry 的回复更清楚:
^(?![^a-zA-Z]*$|[^a-z0-9]*$|[^a-z<+$*]*$|[^A-Z0-9]*$|[^A-Z<+$*]*$|[^0-9<+$*]*$|.*[|;{}]).*$
我不怀疑 Jerry 的版本可以工作,但你想维护哪一个?
事实上,你可以进一步分解它并且非常清楚:
my $cases_matched = 0;
$cases_matched++ if ( $pw =~ /\d/ ); # digits
$cases_matched++ if ( $pw =~ /[a-z]/ ); # lowercase
$cases_matched++ if ( $pw =~ /[A-Z]/ ); # uppercase
$cases_matched++ if ( $pw =~ /<\+\$\*/ ); # special characters
my $is_valid = ($cases_matched >= 3) && ($pw !~ /\|;{}/); # At least 3, and none forbidden.
当然,这占用了 6 行而不是 1 行,但是在一年中,当您回过头来必须添加新规则或弄清楚代码的作用时,您会很高兴以这种方式编写它。
仅仅因为你可以在一个正则表达式中做到这一点并不意味着你应该。