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

时间:2013-12-14 10:53:41

标签: regex 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 "PASS\n";
}
else {
  print "FAIL\n";
}

2 个答案:

答案 0 :(得分:1)

我设法使用lookarounds在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 

答案 1 :(得分:0)

对于初学者来说,这是一个稍微可读的替代方案:

#!/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 "FAIL\n";
} else {
   print "PASS\n";
}