代码之家  ›  专栏  ›  技术社区  ›  TheCodeNovice

Perl REGEX在后处理输出文件时重复捕获组

  •  2
  • TheCodeNovice  · 技术社区  · 11 年前

    我正在处理一系列科学格式的数字。例如

    24  6.924E+06  8.316E-01  1.052E-01  1.622E+01  1.311E+01  0.000E+00  6.059E-06 (snip.. extends for a bit)
    

    现在我想为perl编写一个正则表达式,它允许我捕获列表中的第I个值。所以我目前的设置如下

    $_ =~ ^\s+\d+\s+(\d+[.]\d+E[+]\d+);
    my $temp = $1;
    

    这会给我第一个号码。如果我愿意,我希望能够捕获第7个或第50个,而不必编写非常长的正则表达式。

    有一种简洁的方法吗?

    提前感谢。

    3 回复  |  直到 11 年前
        1
  •  6
  •   Miller    11 年前

    使用 split

    my @cols = split ' ', $_;
    
    my $seventh = $cols[6];
    my $fiftieth = $cols[49];
    
        2
  •  2
  •   parthi    11 年前

    拆分是这种情况下的最佳选择。

    my @val = split ' ', $_;
    my $val7 = $val[6];
    
        3
  •  0
  •   Casimir et Hippolyte    11 年前

    第三个数字的示例:

    ^\s+\d+(?:\s+(\d+\.\d+E[-+]?\d+)){3}
    

    重复捕获组时,内容将被最后一个匹配项覆盖。

    注意:在这种情况下,使用起来更干净 [0-9] 而不是 \d 因为你只需要阿拉伯数字。