【问题标题】:File parsing in PerlPerl 中的文件解析
【发布时间】:2015-03-09 08:59:11
【问题描述】:

我正在尝试解析以下格式的文件。

Case1: 0x5sdf258:648s4df ..;. ABCD hhbdch ; extra text 
Case2: 0xdef58e1:18w4we1 .... HCDC ajdknlmk ;extra text

我想去掉分号后面多余的文字,所以我用下面这行

   $row =~ s/;.*//g;

这在情况 2 中有效,但在情况 1 中失败。有没有一种方法可以在这两种情况下执行我的任务?

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    好像你想要这样的东西,

    $row =~ s/;[^;]*$//g;
    

    $row =~ s/;[^;\n]*$//g;
    

    这将删除最后一个分号之后的文本(包括分号)。

    DEMO

    • [^;]* 否定字符类匹配任何字符但不匹配 ; ,零次或多次。

    • $ 断言我们已经走到了尽头。

    代码:

    use strict;
    use warnings;
    
    while(my $line = <DATA>) {
        $line =~ s/;[^;]*$//g;
        print $line."\n";
    }
    
    
    __DATA__
    Case1: 0x5sdf258:648s4df ..;. ABCD hhbdch ; extra text 
    Case2: 0xdef58e1:18w4we1 .... HCDC ajdknlmk ;extra text
    

    输出:

    Case1: 0x5sdf258:648s4df ..;. ABCD hhbdch 
    Case2: 0xdef58e1:18w4we1 .... HCDC ajdknlmk
    

    【讨论】:

    • 我不知道原因,但它对我不起作用...你能给我解释一下吗?
    • 我不知道它在这个演示中是如何工作的。在实际代码中它仍然失败。我已经咬住了这条线。
    • 无论如何我想出了另一种方法: $row =~ s/(0x[0-9a-f]+:\s+\w+\s+....\s+.*);.* $/$1/克; Case1 和 Case2 文本不是行的一部分。
    【解决方案2】:
    ;(?!.*;).*
    

    试试这个。查看演示。

    https://regex101.com/r/eS7gD7/30

    【讨论】:

    • 这个正则表达式,应该由它的发布者解释,找到一个分号,后面没有任何其他分号。但我担心它使用了一种低效的方法来得出答案,使用零宽度的否定前瞻断言。
    猜你喜欢
    • 2016-01-22
    • 2012-06-08
    • 2019-05-19
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2013-07-17
    • 2019-10-10
    • 2016-07-31
    相关资源
    最近更新 更多