我有一个包含这样的字符串:
##### 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"
什么字符串模式指定了我正在寻找的“反向搜索”?
答案 0 :(得分:10)
您可以使用
local pattern = ".*abc '([^']+)'"
.*
是贪婪的,所以它在匹配之前尽可能多地咀嚼(在这种情况下,它会咀嚼所有早期的比赛并给你最后的比赛)。
或者,如果你真的想要,你也可以扭转你的字符串和你的模式,但我认为最好依靠贪婪的.*
:P
pattern = "'([^']+)' cba"
print(text:reverse():gmatch(pattern)()) -- rab
print(text:reverse():gmatch(pattern)():reverse()) -- bar