2014-01-13 45 views
0

我正在使用OTRS 3.3。我目前正在嘗試完成以下操作: 我必須使用PostMaster Filter功能從電子郵件中獲取多行文本。該郵件包含以下文本(例如):OTRS Postmaster篩選器:用於查找多行文本的正則表達式

Description: 

Job to be done according to specifikation 
AB C12356 
AB C15356 
AB C12357 
AB C12956 
AB C12056 

Details: 

我一定要得到「說明」的文本,直到「詳細信息」開始。我嘗試使用regEx

Description:\n\n.* 

但我只得到想要的文本的第一行。我讀過,我可以使用「/ m」或「/ g」,但我真的不知道它是如何工作的,或者我怎樣才能獲得文本,直到另一個文本開始。

有人能幫我找到合適的regEx嗎?

+0

您一次只能讀一行。你嘗試過使用'File :: Slurp'嗎? – fugu

回答

-1

試試這個:

/Description:(.+?)Details:/s 

說明

Regular expression visualization

演示

http://regex101.com/r/nM2uF1

討論

我已經添加了s修飾符以使.也與新行相匹配。

我可以使用 「/ M」 或 「/ G」,但我真的不明白它是如何工作

  • /m(多)修飾詞表示該^$ metachars應只匹配一行的開始和結束。
  • /g(全局)修飾符指示正則表達式在第一次匹配時不會停止。相反,風味會發現你的字符串內的所有匹配。
+0

當然,你需要在你使用這個正則表達式的字符串中包含整個電子郵件。 – tripleee

2

您目前只一次只讀一行。

您應該更改默認設置爲「\ n」的輸入記錄分隔符。

local undef $/; 

use English; 
local undef $INPUT_RECORD_SEPARATOR; 

如果未定義它,你可以在一個隨時隨地瀏覽整個多行字符串。

#!/usr/local/bin/perl 
use strict; 
use English; 
local undef $INPUT_RECORD_SEPARATOR; 

my $record = (<>); 

if ($record =~ /.*Description:(.*)Details.*/s){ 
    print $1; 
} 

允許使用正則表達式修飾符。以匹配換行符,它不是默認的。

2
use warnings; 
use strict; 
use File::Slurp; 

my $file = read_file('in.txt'); 

while($file=~/Description:(.*)Details/gs){ 
    print "$1\n"; 
} 

輸出:

Job to be done according to specifikation 
AB C12356 
AB C15356 
AB C12357 
AB C12956 
AB C12056