你所接受的答案并不能产生你在问题中所要求的结果。具体来说,
POSIX
字符类
[:alphanum:]
不会匹配标点符号,这意味着
6t$ $eed5 *jh将不会被匹配。为了匹配标点符号,你需要将
[:punct:]
添加到字符类中。请参考
正则表达式速查表。
例如,如果你有一个包含以下内容的文件tokens.txt:
aa df rrr5 4323 54 hjy 10 gj @fgf %d fr43 6t$ $eed5 *jh
并运行此Perl脚本:
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
字母数字混合:aa df rrr5 4323 54 hjy 10 gj @fgf %d fr43 6t$ $eed5 *jh
然而,从你的问题来看,似乎你不想匹配所有标点符号,例如@和%,而是只想匹配特定的标点符号,如$和*。
如果是这种情况,那么你只需要将Alphanum匹配改为:
my @alphanum = grep /^[[:alnum:]\$\*]+$/, @temp;
然后您将获得所需的输出:
数字:4323 54 10
字母:aa df hjy gj
数字和字母混合:aa df rrr5 4323 54 hjy 10 gj fr43 6t$ $eed5 *jh