【问题标题】:Grabbing one character after the Nth pattern match - PERL在第 N 个模式匹配后抓取一个字符 - PERL
【发布时间】:2016-09-15 21:45:31
【问题描述】:

我有一个结构如下的示例文件,我想对其执行一些操作:

1112283569;AOEEEEAOAO.;300012299419;0030000302;ALLE;0.00;0.00;0.00;0.00;79149449.66;0.00;7914944
1112283569;AOEEEEAOAO.;300012;;;;AAAAA299419;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66
1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149
*;CON;*;0030000302;ΑLLEO;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149449.66;0.00
;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00

我正在尝试为此提出解决方案。我需要读取一个看起来像上面的文件, 由';'分隔我需要一次检查每行第三个分隔符之后的字符。它不会在一个 静态列,所以我需要一些方法来捕获第 n 个分隔符 (;) 之后的字符,我可以用正则表达式来做到这一点(我认为。)

即,对于上述输出:

第 1 行 - 不满足条件 第 2 行 - 不符合条件 第 3 行 - 符合条件 第 4 行 - 不符合条件 第 5 行 - 满足条件

最后它会输出类似:

1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149
;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00

(仅第三个分隔符后的第一个字符为 * 的行) 我找到了这种类型的正则表达式,但我不确定它是否适用于这种情况? :

   /\%(^\%([^ ]* \)\{6\}\)\@<=.

【问题讨论】:

    标签: perl matching


    【解决方案1】:

    您可以通过split-ing ; 来完成,然后检查必填字段的第一个字符。

    use strict;
    use warnings;
    
    my $char = '*';
    my $nth = 3;
    
    my $file = 'data_delim.txt';
    open my $fh, '<', $file or die "Cannot open $file -- $!";
    
    while (my $line = <$fh>) 
    {
        my @fields = split ';', $line, $nth+1;
    
        if ($fields[$nth] =~ m/^\Q$char/) {
            print $line;
        }   
    }
    

    上面的$nth 代表“Nth”规范,在问题示例中3。我们通过传递最后一个参数告诉split 只取所需的N+1 个元素。 \Q 转义 *,否认它的特殊含义。见quotemeta。您可以只选择检查所需的字段并将循环体缩短为

    print $line if (split ';', $line)[3] =~ m/^\Q$char/; # or /\*/
    

    我怀疑问题可能涉及更多内容并保留所有前面的术语。

    对于带有显示输入的输入文件data_delim.txt 打印

    1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149 ;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00

    我使用了示例输入和输出,因为我没有完全理解描述。我只能希望这是对问题的正确解释。

    【讨论】:

    • 有没有办法扭转 if 语句,基本上 - 如果条件不适用,打印该行,我尝试了一个!=〜,没有错误,但显然没有工作。如果没有,我也试过。基本上,如果第三个分隔符后有 *,则不要打印该行。
    • @onlyf 要恢复if 语句,请使用unless 而不是if(我不建议这样做,因为它很丑)或使用!~ 而不是=~
    • @onlyf 正如 PerlDog 所说,您可以使用 !~,因此如果没有匹配项,if 的计算结果为 true。你也可以明确地否定它,if (not /regex/)(或者像 PerlDog 说的那样使用unless)。
    • 谢谢两位。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2013-08-13
    • 2020-02-09
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多