【问题标题】:perl regular expression pattern matchingperl 正则表达式模式匹配
【发布时间】:2015-10-16 08:44:37
【问题描述】:

作为 GMF 文件输入:

CUSTEVSUMMROW_GPRS GPRS - Nova Subscriber Non-Smartphone Package|3126|GB| | 
CUSTEVSUMMROW_GPRS GPRS - Nova Subscriber Smartphone Package|3126|GB| | 
CUSTEVSUMMROW_GPRS GPRS - Nova Subscriber Non-Smartphone Package -  Charged|3126|GB|7500000|234446

在 perl 代码中,我使用下面的代码从行中提取字符串

if($line=~m/^(CUSTEVSUMMROW_GPRS|CUSTEVSUMMROW).*?\s(.*?)\|(\d+)\|.*\|(.*?)$/)
{
    $tag=$1;
    $lineTxt=$2;
    $usage = $3;
    $amt = $4;
}

输出:

tag :: CUSTEVSUMMROW_GPRS  lineTxt :: GPRS - Nova Subscriber Non-Smartphone Package  usage :: 3126  amt ::
tag :: CUSTEVSUMMROW_GPRS  lineTxt :: GPRS - Nova Subscriber Smartphone Package  usage :: 3126  amt ::
tag :: CUSTEVSUMMROW_GPRS  lineTxt :: GPRS - Nova Subscriber Non-Smartphone Package - Charged usage :: 3126 amt :: 234446

如何检索/打印使用的单位是 MB 或 GB。谁能帮帮我。

【问题讨论】:

    标签: perl


    【解决方案1】:

    您没有捕获\d+ 之后的列。为此添加括号。

    .*greedy,即它尽可能匹配。添加? 使其节俭

    if ($line =~ /^(CUSTEVSUMMROW_GPRS|CUSTEVSUMMROW).*?\s(.*?)\|(\d+)\|(.*?)\|/)
    

    您也可以将替代方案重写为

    (CUSTEVSUMMROW(?:_GPRS)?)
    

    【讨论】:

      【解决方案2】:

      鉴于你有什么:

      if($line=~m/^(CUSTEVSUMMROW_GPRS|CUSTEVSUMMROW).*?\s(.*?)\|(\d+)\|(.*?)\|(.*?)$/)
      {
          $tag=$1;
          $lineTxt=$2;
          $usage = $3;
          $units = $4;
          $amt = $5;
      }
      

      但我建议这不是解决此问题的最佳方法 - 我会考虑使用 split 并单独处理您的第一个字段。

      可能是这样的:

      #!/usr/bin/env perl
      use strict;
      use warnings;
      
      use Data::Dumper;
      
      my @fields = qw ( tag lineTxt usage units amt );
      
      while (<DATA>) {
          my ( $first_field, @record )  = split '\|';
      
          #split the first field on _just_ the first space.
          unshift( @record, $first_field =~ m/^(\w+) (.*)$/ );
      
          #use a hash slice to put that record into a hash of named keys.
          my %data;
          @data{@fields} = @record;
          print Dumper \%data;
      
          # can of course, make this an array of hashes quite easily. 
      }
      
      
      __DATA__
      CUSTEVSUMMROW_GPRS GPRS - Nova Subscriber Non-Smartphone Package|3126|GB| | 
      CUSTEVSUMMROW_GPRS GPRS - Nova Subscriber Smartphone Package|3126|GB| | 
      CUSTEVSUMMROW_GPRS GPRS - Nova Subscriber Non-Smartphone Package -  Charged|3126|GB|7500000|234446
      

      这会将每条记录打印为:

      $VAR1 = {
                'units' => 'GB',
                'tag' => 'CUSTEVSUMMROW_GPRS',
                'amt' => '7500000',
                'usage' => '3126',
                'lineTxt' => 'GPRS - Nova Subscriber Non-Smartphone Package -  Charged'
              };
      

      【讨论】:

        猜你喜欢
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多