2012-02-01 130 views
3

我有一個包含類似這樣的字符串:在Lua中反向string.find()或string.gmatch?

##### abc 'foo' 
/path/to/filename:1 
##### abc 'bar' 
/path/to/filename:1 

字符串可能會非常長(比如,50線)和不經常更改。

我想獲取單引號(本例中爲bar)之間的最後一次出現的文本。這與其他人的Python problem類似(除了在Lua中對我無效的答案,如下所示)。

我可以分析每一行,並把結果放到一個數組,然後只取數組的最後一個元素,但是這似乎並沒有優雅的對我說:

 
local text = [[ 
    ##### abc 'foo' 
    /path/to/filename:1 
    ##### abc 'bar' 
    /path/to/filename:1 
]] 

local arr = {} 
local pattern = "abc '([^']+)'" 
for s in text:gmatch(pattern) do 
    table.insert(arr, s) 
end 
print('last:', arr[#arr]) 

我感興趣使用Lua字符串模式從結尾搜索字符串。下面我嘗試的模式開始從一開始就結束的,而不是:

 
local text = [[ 
    ##### abc 'foo' 
    /path/to/filename:1 
    ##### abc 'bar' 
    /path/to/filename:1 
]] 

-- FIXME: pattern searches from beginning 
local pattern = "abc '([^']+)'.*$" 

local s = text:gmatch(pattern)() 
assert(s == 'bar', 'expected "bar" but saw "'..s..'"') 
print('last:', s) 

這產生了:

 
input:12: expected "bar" but saw "foo" 

什麼字符串模式指定「反向搜索」我在找什麼?

回答

11

你可以使用

local pattern = ".*abc '([^']+)'" 

.*是貪婪的,因此嚼了儘可能多的,因爲它可以它匹配之前(在這種情況下,它嚼了所有早期的比賽,給你最後一個)。

或者,如果你真的想要,你可以扭轉你的字符串(在某種程度上)你的模式太多,但我認爲這是最好依賴於貪婪.*:P

pattern = "'([^']+)' cba" 
print(text:reverse():gmatch(pattern)())   -- rab 
print(text:reverse():gmatch(pattern)():reverse()) -- bar