0

我正在使用 OTRS 3.3。我目前正在尝试完成以下工作:我必须使用 PostMaster Filter 功能从电子邮件中获取一些多行文本。该电子邮件包含以下文本(例如):

Description: 

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

Details:

在“详细信息”开始之前,我必须在“描述”之间获取文本。我尝试使用正则表达式

Description:\n\n.*

但我只得到想要的文本的第一行。我读到我可以使用“/m”或“/g”,但我真的不明白它是如何工作的,或者在另一个文本开始之前我如何获取文本。

有人可以帮我找到合适的正则表达式吗?

4

4 回答 4

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;
}

正则表达式修饰符 s 允许 . 匹配换行符,默认情况下不匹配。

于 2014-01-13T10:58:18.870 回答
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
于 2014-01-13T11:31:09.517 回答
0

您无法使用可以在 OTRS 的管理 GUI 中定义的 Postmaster 过滤器来实现此目的;因为你的正则表达式总是只匹配一行。

您可以通过编写自定义Ticket Postmaster Module或使用CMD Postmaster Filter来满足您的要求。

于 2014-01-15T20:22:18.977 回答
-1

尝试这个:

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

描述

正则表达式可视化

演示

http://regex101.com/r/nM2uF1

讨论

我也添加了s修饰符以.匹配新行。

我可以使用“/m”或“/g”,但我真的不明白它是如何工作的

  • ( /mmultiline) 修饰符表示^and$元字符应该只匹配一行的开头和结尾。
  • ( /gglobal) 修饰符表示正则表达式风格不会在第一次匹配时停止。相反,风味会在您的字符串中找到所有匹配项。
于 2014-01-13T10:39:57.723 回答