如何从字符串中提取一堆数字?

时间:2009-05-07 11:50:28

标签: perl string extraction

这是示例测试文件:

  Barcode:*99899801000689811* 
  JSC4000I accountNumber:10006898Sequence Number:998 Envelopes: 1 
  LCD5010V Using jsl 'CUSOFF' for output page '6'
  Barcode:*99999901000673703* 
  LCD5010V Using jsl 'CUSOFF' for output page '4'
  LCD5005V Using job 'A' for current page '4'

因此,在这个文件中,如何搜索单词条形码并提取它的前五位数,同时将其传递给数组。

提前致谢。

4 个答案:

答案 0 :(得分:6)

尝试正则表达式,这样的事情应该有效:

  

Barcode:\*(\d{5})

答案 1 :(得分:1)

正则表达式是一种方法。但是,只是为了给你一些完全不同的东西,以下是indexsubstr处理这些内容的方法:

my @array;
foreach my $line ( <$file> ) {
    if ( index( $line, 'Barcode:' ) == 0 ) {
        push @array, substr $line, 9, 5;
    }
}

答案 2 :(得分:0)

我的解决方案类似于Manni,但我建议使用while逐行读取文件。你可以像他一样使用substr(),但是带有锚点和没有量词的正则表达式会非常快:

my @barcodes;
while( <$fh> )
    {
    next unless m/^Barcode:\*([0-9]{5})/;

    push @barcodes, $1;
    }

根据我正在做的其他事情,我可能会改用地图。映射表达式位于列表上下文中,因此m //运算符返回它在任何括号中匹配的事物列表:

my @barcodes = map { m/^Barcode:\*([0-9]{5})/ } <$fh>;

我怀疑任何现实生活中的答案会有更多的代码来警告你以Barcode:开头但缺少数字的行。我还没有遇到一个完美的输入文件:)

\ G锚点在你离开的地方拾取正则表达式匹配,在同一个字符串上的最后一个匹配,在这种情况下就在冒号之后:

my @barcodes;
while( <$fh> )
    {
    next unless m/^Barcode:/;

    unless( m/\G\*([0-9]{5])/ )
        {
        warn "Barcode is missing number at line $.\n";
        next;
        }

    push @barcodes, $1;
    }

答案 3 :(得分:0)

数组上下文中的模式匹配将返回标记的值(由'('和')')作为列表。将它与循环修饰符'g'结合起来以保持重新匹配,你可以在一行上完成所有操作,我觉得它非常易读。

my $string =<<'HERE';
Barcode:*99899801000689811* 
JSC4000I accountNumber:10006898Sequence Number:998 Envelopes: 1 
LCD5010V Using jsl 'CUSOFF' for output page '6'
Barcode:*99999901000673703* 
LCD5010V Using jsl 'CUSOFF' for output page '4'
LCD5005V Using job 'A' for current page '4'
HERE

my @array = $string =~ m!Barcode:\*([0-9]{5})[0-9]+\*!g;

# or

foreach my $barcode ($string =~ m!Barcode:\*([0-9]{5})[0-9]+\*!g)
{
    # do stuff with $barcode
}