我试图在perl文本的不同部分与正则表达式匹配,这些部分不在同一行中。
我的文件大小为200 MB aprox,所有情况类似于以下示例:
rewfww
vfresrgt
[叔
*** BLOCK 049 Aeee / Ed“ewewew”U 141202 0206
BLAH1
BLAH2
END
我希望在$ 1中的“***”,$ 2中的BLAH1和$ 3中的BLAH2之后提取同一行中的所有内容。
我尝试了以下但没有成功:
打开(存档,“C:/Users/g/Desktop/blahs.txt”)或死“die \ n”;
while(< archive>){
if($_ =~ /^\*\*\*(.*)\n(.*)/s){
print $1;
print $2;
}
}
还有一个复杂性:我不知道每种情况下有多少BLAH。也许一个案例只有BLAH1,其他案例只有BLAH1,BLAH2和BLAH3等。唯一可以肯定的是最终“END”分隔案件。
此致
答案 0 :(得分:1)
答案 1 :(得分:0)
怎么样:
#!/usr/bin/perl
use strict;
use warnings;
open(my $archive, '<', "C:/Users/g/Desktop/blahs.txt") or die "die: $!";
while(<$archive>){
if (/^\*{3}/ .. /END/) {
s/^\*{3}//;
print unless /END/;
}
}
答案 2 :(得分:0)
据我了解您的问题,以下内容适用于我。如果您正在寻找更严格或更严格的事情(或发现任何错误!),请更新或提供反馈。
^(\*{3}.*\n{2})(([a-zA-Z])*([0-9]*)\n{2})*(END)$
^(\*{3}\n{2})
- 查找由三个* s后跟两个换行符组成的行 - 如果您希望/需要检查“错误”启动,可以在最后一个右括号后添加*来重复此操作。虽然看起来你之前可能在文件中有数据,但这是你真正关心/想要捕获的数据的开始。
(([a-zA-Z])*([0-9]*)\n{2})*
- 所需的单词字符后跟一个数字(如果您的BLAH计数> 9,则为数字),并检查两个尾随空格。最后的*表示这可以重复零次或多次,这说明了没有数据的情况。如果您想要在没有数据使用的情况下失败?而不是*表示它必须重复1次或更多次。 此段假设您要检查格式为字+数字的数据。如果不是这种情况,可以轻松修改此部分以接受更广泛的数据 - 如果您需要/需要一个或多或少的严格案例,请告诉我
(END)$
- 正则表达式以序列“END”结束。如果允许数据继续,并且您只想在此时停止捕获,请不要包含$
我没有权限发布图片,但是一个很棒的网站可以检查并查看正则表达式的可视化表示https://www.debuggex.com/