关于通过遵循给定模式从现有字符串中提取子串

时间:2012-02-02 16:19:25

标签: regex perl

我有一组显示以下模式的字符串:

AB01234-01B
BC4567-02C

我想通过仅保留中间数字来从这些字符串中提取子字符串。

例如,对于第一个,我只需要1234,然后删除AB0-01B

对于第二个,我只需要4567.如何在perl中实现这个目标

3 个答案:

答案 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+)/);
}