3

我有一个这样的字符串:

$var = '123456d';

或者可能

$var = '123456'; # (no alpha char)

如果重要的话,最多会有 6 位数字,不少于 5 位。数字中没有字母、空格或特殊混合。

在我的 Perl 脚本中,我需要删除并返回最后一个字母字符和不带字母字符的字符串。

我想可以使用 \D 和修剪?还是砍?但是,必须有一种简单的方法可以快速获取两个变量。

my $numbers =~   s/\D+?$var//;  #???  

my $alpha = substr($var, 0, -1); ## but no alpha check.

或者

my $alpha = chop($var); ## but no alpha check.

然后 if aZ 等等来检查它是否是一个字母字符。

或者我的能力解决方案的限制:

$alpha = $var;
$alpha =~ s/[0-9]//ig;
$var =~ s/[a-Z]//ig;
$numbers = $var;

所以结果:

($numbers == '123456')
($alpha eq 'd') (or '' if nothing)

我觉得在这里问这个问题太微不足道了,但是我找不到或写出适用的解决方案。

我对 =~ s 的使用只是一个猜测,但是,必须有更好的方法,甚至是单线。

感谢这里的所有帮助...

深思熟虑后抱歉!数字后面可能有 2 个字母字符!它们需要作为单个 var ($alpha eq 'dd') 一起返回

我也发现了这个:

$var =~ s{^([0-9]+).*}{$1}i;
4

2 回答 2

6

使用\pL将避免捕获数字,并使字符串可选将确保即使对于没有结尾字母的数字也会发生匹配。

my $var = '123456d';
my ($num, $letter) = $var =~ /^(\d+)(\pL)?$/;

请注意,您不能使用\w来捕获可能的结尾字母,因为它还包括数字。正如 tchrist 所指出的,\p{alpha}也可以使用。

于 2012-05-11T15:54:33.160 回答
0

也许是这样的:

my $numbers =~ s/(\d+)(\p{alpha}+)?/$1/;

my $alpha = $2;

the$1指的是第一个括号捕获, the$2指的是第二个。

已编辑:用于\d数字,\p{alpha}用于 alpha。

于 2012-05-11T15:39:56.393 回答