我有一组显示以下模式的字符串:
AB01234-01B
BC4567-02C
我想通过仅保留中间数字来从这些字符串中提取子字符串。
例如,对于第一个,我只需要1234
,然后删除AB0
和-01B
对于第二个,我只需要4567.如何在perl中实现这个目标
答案 0 :(得分:1)
echo "AB01234-01B\nBC4567-02C"|perl -nle 'm{0*(\d+)} and print $1'
1234
4567
答案 1 :(得分:1)
这个正则表达式适合你:
's/^[a-z0]+(\d+).*$/\1/i'
<强>解释强>
^ - start of the text
[a-z0]+ - match 1 or more of a-z alphabets or number 0
\d+ - match 1 or more decimal number
(\d+) - group these numbers to be back referenced later
.* - match 0 or more any characters
$ - end of text
\1 - replace with back reference # 1 which is what we have in brackets (\d+)
/i - ignore case
因此,在字符串AB01234-01B
中,它在匹配AB0后使用(\ d +)将1234组合在一起,并用1234
替换整个字符串。
答案 2 :(得分:0)
如果规则只是删除前导零,最简单的方法是让perl将字符串转换为数字,因为"0123"
将成为123
。
while(<DATA>) {
say 0+$_ for /(\d+)/;
}
__DATA__
AB01234-01B
BC4567-02C
或作为子:
sub extract {
return 0+$1 if ($_[0] =~ /(\d+)/);
}