我试图基本上尝试将特定数量的文本与最后出现的一个或多个数字分开。如果有1个尾随号码,则下面有效但有两个或更多时没有? (\ d +)不应该在“P_TIME12”中得到“12”吗?
my @strs = ('P_ABC1','P_DFRES3','P_TIME12');
foreach my $str (@strs) {
if ($str =~ /^P_(\w+)(\d+)$/) {
print "word " . $1 . " digits " . $2 . "\n";
}
}
结果
word ABC digits 1
word DFRES digits 3
word TIME1 digits 2
TIA
答案 0 :(得分:1)
\w
包含数字,如果只有数字位于最后,则使用[_a-zA-Z]
和\w+
是贪婪的,它首先匹配整个单词并且不为\d+
留下任何内容,因此它必须回溯1个字符,并且最后一个字符对于\d+
< / p>
如果您想要延迟运算符,因为中间有数字,请使用^P_(\w+?)(\d+)$
答案 1 :(得分:1)
/^P_(\D+)(\d+)$/
字符类\d
匹配数字;它的否定\D
与其他一切相符。
答案 2 :(得分:1)
如果您可以在第一部分中捕获空格,则更简单的解决方案是在尾随数字之前匹配任何 ungreedily ,然后是尾随数字贪婪地。
这样做的好处是,您可以匹配第一部分中的偶数(假设它们没有出现在末尾)。 和空间一样,正如已经说过的那样。
那是:
my @strs = qw(P_1ABC1 P_DFRES3 P_3TIME12);
foreach (@strs) {
if ( /^P_(.*?)(\d+)$/ ) {
print ">$1<", "\t\t", ">$2<", "\n"
}
}
产生:
>1ABC< >1<
>DFRES< >3<
>3TIME< >12<
答案 3 :(得分:0)
\ w匹配“单词字符”,包括数字和下划线。因为你已经要求至少一个数字(\ d +),\ w是贪婪的并且也匹配一个。
您应该比\w
更明确,而是使用/^P_([A-Za-z_]+)(\d+)$/
。