Perl:RegEX:多次捕获组

时间:2015-06-09 15:12:58

标签: regex perl

我正在开发一段代码来过滤文本,如下所示:

    <DATA>
    .SUBCKT SVI A B C D E F
    + G H I
    + J K L
    .....
    + X Y Z
    *.PININFO AA BB CC
    *.PININFO DD EE FF
    <DATA>

我需要输出

    A B C D E F
    G H I
    J K L
    .....
    X Y Z

我已经做了一个正则表达式:

m/\.SUBCKT\s+SVI\s(.*)|\+(.*)/gm

问题是我有许多类似的部分,比如输入,但我只需要检测+标题之后的.SUBCKT SVI行,而不是任何其他标题。

我如何能像(\+\s+(.*))那样多次匹配群组。我希望匹配重复捕获组,因为它重复多次。

获得此表达的任何建议。

3 个答案:

答案 0 :(得分:1)

也许这更接近你的需要。

m/\.SUBCKT\s+SVI\s(.*)\n(\+\s+(.*)\n)*/gm

答案 1 :(得分:0)

我利用了@ shawnt00的答案并修改了正则表达式并完成了这项工作。

\.SUBCKT\s+SVI_TRX201TH\s(.*\n(\+\s+.*\n)*)

答案 2 :(得分:0)

这样做你想要的吗?请注意,它会在.....处停止,因为它不会以+.SUBCKT

开头

它不会处理一系列+行紧跟另一行.SUBCKT行的情况;这是一个问题吗?

use strict;
use warnings;

while ( <DATA> ) {
  next unless my $in_range = s/^\.SUBCKT\s+// ... /^[^+]/;
  next if $in_range =~ /E/;

  s/^\S+\s+//;
  print;
}

__DATA__
<DATA>
.SUBCKT SVI A B C D E F
+ G H I
+ J K L
.....
+ X Y Z
*.PININFO AA BB CC
*.PININFO DD EE FF
<DATA>

<强>输出

A B C D E F
G H I
J K L

<强>更新

这是处理上述特殊情况的状态机版本

use strict;
use warnings;

my $state;

while ( <DATA> ) {

  if ( /^\.SUBCKT\s+\S+\s+(.+)/ ) {
    $state = 1;
    print $1, "\n";
  }
  elsif ( /^\+\s+(.+)/ ) {
    print $1, "\n" if $state;
  }
  else {
    $state = 0;
  }
}

__DATA__
<DATA>
.SUBCKT SVI A B C D E F
+ G H I
+ J K L
.SUBCKT SVI A B C D E F
+ M N O
+ P Q R
*.PININFO AA BB CC
*.PININFO DD EE FF
<DATA>

<强>输出

A B C D E F
G H I
J K L
A B C D E F
M N O
P Q R