我有数组的值是用户输入,如:
aa df rrr5 4323 54 hjy 10 gj @fgf %d
现在我想检查数组中的每个值,看它是数字,字母(a-zA-Z)还是字母数字,并将它们保存在其他相应的数组中。
我做了:
my @num;
my @char;
my @alphanum;
my $str =<>;
my @temp = split(" ",$str);
foreach (@temp)
{
print "input : $_ \n";
if ($_ =~/^(\d+\.?\d*|\.\d+)$/)
{
push(@num,$_);
}
}
这很有效。同样,我想检查字母和字母数字值
字母数字示例为:fr43
6t$
$eed5
*jh
答案 0 :(得分:7)
Perl支持POSIX字符类,所以你实际上可以这样做:
$string =~ /^[[:alpha:]]+$/;
$string =~ /^[[:alnum:]]+$/;
数字定义不太明确,但Scalar :: Util的looks_like_number函数可能会按照您的意愿执行。
答案 1 :(得分:3)
您接受的答案不会产生您在问题中声称需要的结果。具体来说,POSIX
字符类[:alphanum:]
与标点符号不匹配,这意味着 6t $ $ eed5 * jh 将不匹配。为了匹配标点字符,您需要将[:punct:]
添加到char类。请参阅Regex cheat sheet。
例如,如果您有包含以下内容的文件tokens.txt:
aa df rrr5 4323 54 hjy 10 gj @fgf%d fr43 6t $ $ eed5 * jh
你运行这个perl脚本:
#!/usr/bin/perl -w
use warnings;
use diagnostics;
use strict;
use Scalar::Util qw( looks_like_number );
my $str =<>;
my @temp = split(" ",$str);
my @num = grep { looks_like_number($_) } @temp;
my @char = grep /^[[:alpha:]]+$/, @temp;
my @alphanum = grep /^[[:alnum:][:punct:]]+$/, @temp;
print "Numbers: " . join(' ', @num) . "\n";
print "Alpha: " . join(' ', @char) . "\n";
print "Alphanum: " . join(' ', @alphanum) . "\n";
像这样:
cat tokens.txt | ./tokenize.pl
你得到了输出:
电话号码:4323 54 10
阿尔法:aa df hjy gj
Alphanum:aa df rrr5 4323 54 hjy 10 gj @fgf%d fr43 6t $ eed5 * jh
但是,您的问题似乎是,您不希望匹配所有标点字符,例如@
和%
,而只是匹配$
和{{}等特定字符符号。 1}}。
如果是这种情况,那么您只需将Alphanum匹配更改为:
*
然后,它将为您提供所需的
输出电话号码:4323 54 10
阿尔法:aa df hjy gj
Alphanum:aa df rrr5 4323 54 hjy 10 gj fr43 6t $ eed5 * jh
答案 2 :(得分:1)
为了将输入分成数组,可以使用这样的方法,并且可以轻松添加或更改匹配。
my $input = 'aa df rrr5 4323 54 hjy 10 gj @fgf %d';
my %tests = (
num => '\d+',
alpha => '[[:alpha:]]+',
alnum => '[[:alnum:]]+'
);
my %res;
for my $t (keys %tests) {
for (split(' ', $input)) {
push(@{ $res{$t} }, $_) if (/^$tests{$t}$/i);
}
}
答案 3 :(得分:0)
字母
/^[a-z]+$/i
大多数人的意思是字母数字:
/^[a-z0-9]+$/i
但等待:
注意:字母数字ex。 fr43 6t $ $ eed5 * jh
我不明白这一点,但从下面的评论和上面的引文来看,你的意思是字母数字可能是通过
来实现的。 /^[[:graph:]]+$/
匹配除空格之外的任何可打印ASCII字符。
希望这已经解决了你的问题。
答案 4 :(得分:0)
如果你想识别所有有效数字(科学/固定/ ......表示法),你可以让Perl做这样的工作:
sub test_num {
no warnings "all";
$b = "$_[0]";
$a = $b + 0;
return ($a eq $b);
}
push(@num, $tmp) if (test_num($tmp));
(行$b = "$_[0]";
的原因是原来的变量 - $tmp
- 被带入test_num
函数内的数字上下文 - 有点不受欢迎的副作用)