perl中的正则表达式,用于提取信息

时间:2014-06-18 16:04:10

标签: regex perl

我如何匹配两个特定单词之间任意数量的任何字符...我有一个文档,其中包含一个文本块,包含在'开始参数'和'结束参数'。这两个短语由多行文字分隔。所以我的文字看起来像这样:

begin parameters
<lines of text here \n.
end parameters

我当前的正则表达式如下所示:

my $regex = "begin parameters[.*\n*]end parameters";

然而这不匹配。有人有什么建议吗?

4 个答案:

答案 0 :(得分:3)

使用/s开关,以便任何字符.都匹配新行。

我还建议您通过将?添加到量词来使用非贪婪匹配。

use strict;
use warnings;

my $data = do {local $/; <DATA>};

if ($data =~ /begin parameters(.*?)end parameters/s) {
    print "'$1'";
}

__DATA__
begin parameters
<lines of text here.
end parameters

输出:

'
<lines of text here.
'

答案 1 :(得分:1)

通过将这些字符放在字符类中,您当前的正则表达式无法实现您的想法;它匹配以下任何字符:(.*\n*),而不是实际匹配您想要的字符。

您可以使用s修饰符强制点.匹配换行序列。通过在您要提取的内容周围放置一个捕获组,您可以使用$1

访问该组
my $regex  = qr/begin parameters(.*?)end parameters/s;
my $string = do {local $/; <DATA>};
print $1 if $string =~ /$regex/;

请参阅Demo

答案 2 :(得分:0)

请试试这个:

Begin Parameters([\S\s]+?)EndParameters

翻译:这将查找作为分隔符的任何字符,或任何除了分隔符之外的所有字符(实际上,它将查找任何字符),直到找到&#34; EndParameters&#34;。 我希望这是你所期待的。

答案 3 :(得分:0)

元字符.在字符类中丢失了它的特殊属性。

因此[.*\n*]实际匹配0个或更多文字句点或零个或多个换行符。

您真正想要的是匹配0或更多任何字符 0或更多的换行符。您可以在非捕获组中表示:

begin parameters(?:.|\n)*?end parameters