perl多个正则表达式可以匹配多行

时间:2019-03-08 21:29:09

标签: regex perl multilinestring

我正努力尝试在文本文件的一组行中捕获多个匹配项。

数据采用一堆格式,例如

  

AO22_X1N_A9PP96CTS_C24 SYN_INC_187(.A0(test_so6),.A1(n2218)   ,       .B0(U_PAUSEdata_ff_int_28_),.B1(n2),.Y(n2597));

     

NAND3_X1R_A9PP96CTUL_C16 SYN_INC_154(.A(n1563),       .B(U_PAUSEwcnt),.C(n1640),.Y(n1467));

第一部分是名称。以后可能想要Tat,但现在我对端口ex .A(net)感兴趣 理想情况下,我想捕获所有输入的网络名称(具有A,B,C,D等的名称)和单个输出.Y(网络)

最终,我想将它们存储到一个散列中,其中输出网络是键,数据是对输入数组的引用,但现在我只是试图捕获所有输入网络。

这就是我目前正在使用的

open (FILE, "<maca") or die("Can not open $file");
  while (defined(my $cur_line = <FILE>)) {

    if ($cur_line =~ m/[A-Z].*?\.[A-C]\d* \( (.*?) \).*?;/mg) { 
      print "THIS gate $cur_line $1 $2 $3\n";  
      }
  }

我正在尝试这种显示方式

  

此门NAND3_X1R_A9PP96CTUL_C16 SYN_INC_154(.A(n1563),       .B(U_PAUSEwcnt),.C(n1640),.Y(n1467));

     

n1563 U_PAUSEwcnt n1640

但是我明白了。其实我不在乎第一行,只是第二行。首先是用于调试。我认为m将搜索多行,而g将全局匹配多行字符串。我想念什么

  

此门.B(U_PAUSEwcnt),.C(n1640),.Y(n1467));

     

n1640

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,那么您正在寻找这样的东西:

while ($data =~ /(\w+)\s*\((.+?)\)\s*;/gm) {
  my $line = $1;
  my $vals = $2;
  while ($vals =~ /\.(\w+)\s*\(\s*(\w+)\s*\)/g) {
    print "$line .. $1: $2.\n"
  }
}

我将变量$data命名为变量( .. ),因为它包含所有行-对吗? 我首先将各行分开,捕获\w之间的字符串,然后取出键值对。看起来所有名称都是字母数字+“ _”,每个--- apiVersion: v1 kind: Pod metadata: name: fail-422f98fc labels: {} annotations: {} spec: containers: - name: base image: python:3.6.6-stretch command: echo imagePullPolicy: IfNotPresent args: '10' restartPolicy: Never nodeSelector: {} volumes: [] serviceAccountName: default affinity: {} 都可以很好地捕获它。

希望这有帮助吗?