Обратный string.find () или string.gmatch в Lua? - PullRequest
3 голосов
/ 01 февраля 2012

У меня есть строка, которая содержит что-то вроде этого:

##### 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"

Какая строковая комбинация указывает на "обратный поиск", который я ищу?

1 Ответ

10 голосов
/ 01 февраля 2012

Вы можете использовать

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

.* является жадным, поэтому он жует столько, сколько он может, прежде чем он совпадет (в этом случае он жует все предыдущие матчи и дает вам последний).

Или, если вы действительно хотите, вы можете изменить свою строку и (своего рода) шаблон тоже, но я думаю, что лучше полагаться на жадного .*: P

pattern = "'([^']+)' cba"
print(text:reverse():gmatch(pattern)())           -- rab
print(text:reverse():gmatch(pattern)():reverse()) -- bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...