2014-12-18 36 views
1

我想在正則表達式中匹配perl不同部分的文本不在同一行。正則表達式在Perl中的新行之後加工

我有一個文件大小200 MB aprox的類似於下面的示例的所有情況:

rewfww

vfresrgt

[叔

*** BLOCK 049 Aeee/ED 「ewewew」U 141202 0206

BLAH1

BLAH2

END

,我想提取所有什麼是在同一行的 「***」 $ 1,BLAH1後在$ 2和BLAH2在$ 3

我已經嘗試沒有成功執行以下操作:

開放(存檔, 「C:/Users/g/Desktop/blahs.txt」)或死亡 「管芯\ n」 個;

while(< archive>){ 
    if($_ =~ /^\*\*\*(.*)\n(.*)/s){ 
     print $1; 
     print $2; 
    } 
} 

更多的複雜性:我不知道在每種情況下有多少BLAH。也許一個案例只有BLAH1,其他案例有BLAH1,BLAH2和BLAH3等。唯一確定的是最終的「結束」誰分開案件。

問候

回答

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

嘗試this.See演示。

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

+0

完美,這就是我想要的但我在哪裏把這東西放在我張貼的代碼? –

+0

@GuidoPujadas完成了這項工作 – vks

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/; 
    } 
} 
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次或更多次。 該段假定您想檢查格式爲word +數字的數據。如果不是這部分可以很容易地修改,以接受更廣泛的數據的情況下 - 讓我知道如果你想/需要或多或少嚴格的情況下

(END)$ - 正則表達式與序列「END」結束。如果數據可以繼續存在,並且您只想在此處停止捕獲,請不要包含$

我沒有發佈圖片的權限,但是有一個很棒的網站來檢查並查看可視化表示你的正則表達式imo是https://www.debuggex.com/