我想要一个脚本来选择用户名。选择用户名的规则是
用户名的最小长度为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";
}
答案 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";
}