我正试图使用lookahead / behind来提取内容,如下所示:
Filename: myfile.txt
Message: myMessage
Time:...
我想使用正则表达式提取文件名和时间之间的内容:
(?<=.txt).*(?=Time)
但由于没有采用换行符,因此无效。我可以改变什么来匹配?
答案 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";
}