我需要一个Perl脚本来查找字符串中至少一个大写、一个小写、一个特殊字符、一个数字和一个空白



我想要一个脚本来选择用户名。选择用户名的规则是

  • 用户名的最小长度为5个字符,最大长度为10个

  • 它应该至少包含一个来自A-Z 的字母

  • 它应该至少包含0-9 中的一个数字

  • 它应该至少包含@#*=中的一个字符

  • 它不应包含任何空格。

我试过这个

if ( length $passwd[$i] <= 10
    && length $passwd[$i] >= 5
    && $passwd[$i] =~ /.*p{Lu}/
    && $passwd[$i] =~ tr/0-9//cd
    && $passwd[$i] =~ /[a-z]/ ) {
  print "PASSn";
}
else {
  print "FAILn";
}

我设法用查找法找到了Regex。我试了很多例子来测试它,看起来它是根据你的条件工作的。如果它不适用于任何模式,请告诉我。

echo eff*sdE8ff | perl -n -e 'print if /^(?=.{5,10}$)(?=.*?[A-Z])(?=.*?d)(?=.*[@#*=])(?!.*s+)/'

更新:看完OP的评论。。。

这是代码:

#!/usr/bin/perl 
use warnings;
use strict;
my @passwd = ('eff*sdE8ff', 'eff*sde8ff');
foreach (@passwd)
{
    if ($_ =~ /^(?=.{5,10}$)(?=.*?[A-Z])(?=.*?d)(?=.*[@#*=])(?!.*s+)/)
    {
        print "PASS: $_ n";
    }
    else
    {
        print "FAIL n";
    }
}

输出:

PASS: eff*sdE8ff 
FAIL 

对于新手用户来说,这里有一个可读性更强的替代方案:

#!/usr/bin/perl
use strict;
use warnings;
my $name = $ARGV[0];
if((length($name)<5 || length($name)>10) ||
   ($name !~ /[A-Z]/)  ||
   ($name !~ /[0-9]/)  ||
   ($name !~ /[@#*=]/) ||
   ($name =~ / /)){
   print "FAILn";
} else {
   print "PASSn";
}

最新更新