У меня есть строка, которая содержит что-то вроде этого:
##### abc 'foo'
/path/to/filename:1
##### abc 'bar'
/path/to/filename:1
Строка может быть очень длинной (скажем, 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
]]
<b>-- FIXME: pattern searches from beginning</b>
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"
Какая строковая комбинация указывает на "обратный поиск", который я ищу?