Perl:用于从复杂行中提取值的perl正则表达式

时间:2016-10-26 15:36:52

标签: perl

输入日志文件:

 Nservdrx_cycle 4       servdrx4_cycle
 HCS_cellinfo_st[10]     (type = (LTE { 2}),cell_param_id = (28)
 freq_info =  (10560),band_ind = (rsrp_rsrq{ -1}),Qoffset1 = (0)
 Pcompensation = (0),Qrxlevmin = (-20),cell_id = (7), 
 agcreserved{3} = ({ 0, 0, 0 }))    
 channelisation_code1   16/5 { 4}   channelisation_code1
 sync_ul_info_st_   (availiable_sync_ul_code = (15),uppch_desired_power = 
 (20),power_ramping_step = (3),max_sync_ul_trans = (8),uppch_position_info =
 (0))
 trch_type  PCH { 7}    trch_type8      
 last_report    0   zeroth bit

我试图仅为我上面的输入提取整数,但我面对一些   如果字符串在开头和结尾包含整数,则会出现问题

For(例如agcreserved {3},HCS_cellinfo_st [10],Qoffset1)   在这里,我不想忽略{3},[10]和1,但在我的代码中它确实如此。   因为我只提取整数。

这里我写了一个简单的正则表达式来提取整数。

我的简单代码:

 use strict;
 use warnings;
 my $Ipfile  = 'data.txt';
 open my $FILE, "<", $Ipfile or die "Couldn't open input file: $!";
 my @array;
 while(<$FILE>)
 {
  while ($_ =~ m/( [+-]?\d+ )/xg)
  { 
   push @array, ($1);
  }

 }
print "@array \n";

输出上面输入的内容:

  

4 4 10 2 28 10560 -1 1 0 0 -20 7 3 0 0 0 1 16 5 4 1 15 20 3 8 0 7 8 0

预期产出:

  

4 2 28 10560 -1 0 0 -20 7 0 0 0 4 15 20 3 8 0 7 0

如果有人可以帮我解释一下?

1 个答案:

答案 0 :(得分:2)

您正在捕获每个整数,因为正则表达式对整数之前/之后可以(或不能)出现的字符没有限制。请记住,/x modifier仅用于允许模式中的空格/注释以便于阅读。

在不了解输出数据的可能结构的情况下,此修改可实现所需的输出:

  while ( $_ =~ m! [^[{/\w] ( [+-]?\d+ ) [^/\w]!xg ) {
    push @array, ($1);
  }

我在整数之前和之后添加了规则以排除某些字符。所以现在,我们只会捕获:

  • 数字前面没有[{/字符
  • 数字
  • 后面没有/字符

如果您的数据在{ N}块中可能包含2位数字(例如PCH {12}),那么这将无法捕获这些数字,并且模式将需要变得更加复杂。因此,该解决方案非常脆弱,不了解有关目标数据的更多规则。