2014-01-13 3 views
0

Я использую OTRS 3.3. и в настоящее время я пытаюсь сделать следующее: Мне нужно получить многострочный текст из электронной почты, используя функцию PostMaster Filter. В письме содержится следующий текст (например):OTRS Postmaster Filter: Regex для поиска многострочного текста

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

Demo

http://regex101.com/r/nM2uF1

Обсуждение

я добавил модификатор s, чтобы . матч новые линии тоже.

Я мог бы использовать «/ м» или «/ г», но я не очень понимаю, как это работает

  • /m (многоканальный) модификатор указывает, что ^ и $ metachars должны соответствуют только началу и концу строки.
  • Модификатор /g (глобальный) указывает, что аромат регулярного выражения не останавливается при первом совпадении. Вместо этого вкус найдет все совпадения внутри вашей строки.
+0

Конечно, вам нужно иметь всю электронную почту в строке, к которой вы применяете это регулярное выражение. – tripleee

2

В настоящее время вы читаете только одну строку за раз.

Вы должны изменить разделитель входных записей, который по умолчанию установлен на «\ n».

local undef $/; 

или

use English; 
local undef $INPUT_RECORD_SEPARATOR; 

Если вы UNDEF, вы можете прочитать всю многострочную строку за один раз.

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

my $record = (<>); 

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

Модификатор regexp s позволяет. для соответствия новым строкам, которые по умолчанию не выполняются.

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 
0

Вы не можете достичь этого с почтмейстеру фильтров можно определить в графическом интерфейсе администратора OTRS; потому что ваши регулярные выражения всегда будут соответствовать только одной строке.

Вы можете достичь своих требований, написав обычай Ticket Postmaster Module или, возможно, используя CMD Postmaster Filter.