我有一个这样的字符串:
$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;
答案 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。