【问题标题】:How do I parse this text file using only regular expressions?如何仅使用正则表达式解析此文本文件?
【发布时间】:2010-07-15 08:40:27
【问题描述】:

考虑一个日志文件,其中包含

r100000|Tom Sawyer|2010-12-01|view.txt

我应该解析并打印

ID:r100000
NAME:Tom Sawyer
DATE:2010-12-01
FILENAME:view.txt

我应该只使用正则表达式。

【问题讨论】:

    标签: perl


    【解决方案1】:
    $line = 'r100000|Tom Sawyer|2010-12-01|view.txt';
    @fields = split /\|/, $line;
    print $fields[0]; # r100000
    

    【讨论】:

      【解决方案2】:

      更简单的方法是使用分隔符将字符串分解为字段。因为你有管道“|”作为分隔符,然后使用它。不需要复杂的正则表达式。另外,如果下次有更多字段怎么办?

      这是一个带有 awk 的(你也可以使用 Perl 的 -F 选项)

      $ awk -F"|" '{print "ID:"$1" Name:"$2" Date:"$3" filename:"$4}' file
      ID:r100000 Name:Tom Sawyer Date:2010-12-01 filename:view.txt
      

      Perl 等价物

      $ perl -F"\|" -ane 'print "ID:$F[1] Name: $F[2] Date:$F[3] filename:$F[4]"' file
      ID:Tom Sawyer Name: 2010-12-01 Date:view.txt
      

      【讨论】:

        【解决方案3】:

        如果要使用正则表达式来解析,

        你可以试试这个:

        $line = r100000|Tom Sawyer|2010-12-01|view.txt;
        
        if($line =~ /^([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)$/)
        {
        $id = $1;
        $name = $2;
        $date = $3;
        $filename = $4
        }
        

        【讨论】:

          【解决方案4】:

          你没有提到 RE 的方言。但例如:

          $ echo 'r100000|Tom Sawyer|2010-12-01|view.txt' | \
            perl -pe 's/^(r\d+)\|([^|]+)\|([0-9-]+)\|(.+)/ID:\1 NAME:\2 DATE:\3 FILENAME:\4/'
          ID:r100000 NAME:Tom Sawyer DATE:2010-12-01 FILENAME:view.txt
          

          【讨论】:

            【解决方案5】:
            use Data::Dumper;
            my %h;
            my $line = 'r100000|Tom Sawyer|2010-12-01|view.txt';
            @h{qw/ID NAME DATE FILENAME/} = (split /\|/, $line);
            print Dumper(\%h);
            

            【讨论】:

              猜你喜欢
              • 2020-09-17
              • 1970-01-01
              • 2013-08-13
              • 1970-01-01
              • 2016-04-27
              • 1970-01-01
              相关资源
              最近更新 更多