我如何匹配两个特定单词之间任意数量的任何字符...我有一个文档,其中包含一个文本块,包含在'开始参数'和'结束参数'。这两个短语由多行文字分隔。所以我的文字看起来像这样:
begin parameters
<lines of text here \n.
end parameters
我当前的正则表达式如下所示:
my $regex = "begin parameters[.*\n*]end parameters";
然而这不匹配。有人有什么建议吗?
答案 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