0

我正在尝试使用前瞻/后向提取边界之间的内容,如下所示:

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

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

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

但它不起作用,因为不采用换行符。我可以改变什么来匹配?

4

2 回答 2

4

首先,你忘了逃避.in .txt

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

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

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

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

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

你去吧。您可以通过仅从一行的开头到结尾进行匹配来稍微改进它:

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

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

于 2013-02-20T09:39:27.217 回答
0

为了.匹配换行符,您需要启用/s,这使得整个字符串被视为单行。

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

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

if (/\.txt(.*?)Time/s)
{
   print "The between portion is:\n$1";
}
于 2013-02-20T09:38:52.000 回答