我正在开发一段代码来过滤文本,如下所示:
<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+(.*))
那样多次匹配群组。我希望匹配重复捕获组,因为它重复多次。
获得此表达的任何建议。
答案 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