如何在Perl中检查值是数字,字母还是字母数字?

时间:2010-04-07 09:19:06

标签: regex perl

我有数组的值是用户输入,如:

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

5 个答案:

答案 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函数内的数字上下文 - 有点不受欢迎的副作用)