我正在尝试使用前瞻/后向提取边界之间的内容,如下所示:
Filename: myfile.txt
Message: myMessage
Time:...
我想使用正则表达式提取文件名和时间之间的内容:
(?<=.txt).*(?=Time)
但它不起作用,因为不采用换行符。我可以改变什么来匹配?
首先,你忘了逃避.
in .txt
。
/(?<=\.txt).*(?=Time)/
其次,您实际上并没有捕获(“提取”)任何东西。
/(?<=\.txt)(.*)(?=Time)/
然后你需要告诉 Perl.
应该匹配每个字符,而不是除换行符之外的每个字符。
/(?<=\.txt)(.*)(?=Time)/s
你去吧。您可以通过仅从一行的开头到结尾进行匹配来稍微改进它:
/(?<=\.txt\n)(.*)^(?=Time)/sm
顺便说一句,在这种情况下似乎没有任何理由使用环视。
为了.
匹配换行符,您需要启用/s
,这使得整个字符串被视为单行。
此外,您可能不应该为此使用环视。通常,仅当您想要获得重叠匹配时才应使用它们。当用于简单地获得部分匹配时,它们可能会产生意想不到的结果。
获得部分匹配的标准方法是使用捕获子组:
if (/\.txt(.*?)Time/s)
{
print "The between portion is:\n$1";
}