在Lua中反转string.find()或string.gmatch?

3 lua

我有一个包含这样的字符串:

##### abc 'foo'
/path/to/filename:1
##### abc 'bar'
/path/to/filename:1
Run Code Online (Sandbox Code Playgroud)

字符串可能非常长(例如,50行)并且不会经常更改.

我想在单引号之间获取最后一次出现的文本(bar在本例中).这类似于其他人的Python 问题(除了答案在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"

什么字符串模式指定我正在寻找的"反向搜索"?

mat*_*fee 10

你可以用

local pattern = ".*abc '([^']+)'"
Run Code Online (Sandbox Code Playgroud)

.*是贪婪的,所以它在匹配之前尽可能多地咀嚼(在这种情况下,它会咀嚼所有早期的比赛并给你最后的比赛).

或者,如果你真的想要,你也可以扭转你的字符串和你的模式,但我觉得依靠贪婪更好.*:P

pattern = "'([^']+)' cba"
print(text:reverse():gmatch(pattern)())           -- rab
print(text:reverse():gmatch(pattern)():reverse()) -- bar
Run Code Online (Sandbox Code Playgroud)