Perl - 返回字符串中最后一位数后的最后一个字母字符,并返回修改后的字符串

时间:2012-05-11 15:24:12

标签: regex perl

我有一个这样的字符串:

$var = '123456d';

或可能

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

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

在我的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.

然后如果a-Z等等,检查它是否是字母字符。

或我的能力解决方案的极限:

$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')

一起返回

我发现这也是0:

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

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:0)

也许是这样的:

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

my $alpha = $2;

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

已修改:使用\d表示数字,\p{alpha}表示alpha。