2012-05-22 26 views

回答

1

問題是,有時線可能會更大。

那麼你只需要從最後尋求進一步的回來。

問題是如何從文件末尾找到第一個單詞「foo」,然後在它之後使用所有內容?

抓住文件的足夠大的塊,以確保你有最後FOO,使用.*foo跳過一切直到幷包括最後的「富」(。*是貪婪)。

local f = io.open('filename', 'r') 
f:seek('end', -1024) 
local text = f:read('*a') 
local after = string.match(text, ".*foo(.*)") 
f:close() 
+0

非常感謝,這對我們幫助很大。 – TotallyStuck

0

如果文件不是太大,你準備採取簡單的出路,這可能幫助:

fh=io.open('myfile.txt','rb') 
str=fh:read'*a' 
pat='foo' 
afterFoo=str:match('.*'..pat..'(.*)$') 
fh:close() 

如果你需要一個更復雜的,但速度更快(大文件在運行時)解決方案,我的猜測是你'在塊中讀取文件,反轉每個文件,並反向查找你的模式。不要忘記跨越邊界尋找你的圖案(在一般情況下,塊至少要重疊你要尋找的圖案的長度)。

有關塊閱讀的更多解釋,請參閱我的文章here

+0

也謝謝你,我的文件可能非常大(我正在解析一個日誌)。 – TotallyStuck

+0

鑑於您已經在使用正則表達式,因此不需要反轉任何內容。只需使用'。* PATTERN'跳過所有內容,包括最後一次出現的'PATTERN'。 – Mud

+0

是的,的確,你是對的:)。糾正。 – jpjacobs