正则表达式与linebreaks背后?

时间:2013-02-20 09:35:19

标签: regex perl

我正试图使用​​lookahead / behind来提取内容,如下所示:

Filename: myfile.txt
Message: myMessage
Time:...

我想使用正则表达式提取文件名和时间之间的内容:

(?<=.txt).*(?=Time)

但由于没有采用换行符,因此无效。我可以改变什么来匹配?

2 个答案:

答案 0 :(得分:3)

首先,您忘了逃避.中的.txt

/(?<=\.txt).*(?=Time)/

其次,你实际上并没有捕捉(“提取”)任何东西。

/(?<=\.txt)(.*)(?=Time)/

然后你需要告诉Perl .应该匹配每个字符,而不是除了换行符之外的每个字符。

/(?<=\.txt)(.*)(?=Time)/s

你去吧。你可以通过从一行的开头到结尾只匹配来改善它:

/(?<=\.txt\n)(.*)^(?=Time)/sm

顺便说一下,在这种情况下似乎没有任何理由使用外观。

答案 1 :(得分:0)

为了使.与换行符匹配,您需要启用/s,这会将整个字符串视为一行。

此外,您可能不应该使用环视。通常,只有在想要获得重叠匹配时才能使用它们。当用于简单地获得部分匹配时,它们会产生意想不到的结果。

获得匹配的一部分的标准方法是使用捕获子组:

if (/\.txt(.*?)Time/s)
{
   print "The between portion is:\n$1";
}