perl中新行后的正则表达式

时间:2014-12-18 18:30:09

标签: regex perl

我试图在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”分隔案件。

此致

3 个答案:

答案 0 :(得分:1)

\*\*\*([^\n]*)\n|(?!^)\G\s*(?!\bEND\b)([^\n]+)

试试这个。看看演示。

https://regex101.com/r/vN3sH3/17

答案 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/