Для сопоставления makeindex
записей может быть полезно использовать грамматику LPEG.Таким образом, вы можете разделять разделители и даже выполнять семантические действия в зависимости от сопоставляемого поля.
local lpeg = assert(require"lpeg")
local C, S = lpeg.C, lpeg.S
local sep = S("@!|")
local str = C((1 - sep)^0)
local idx = str * ( "@" * str / function(match) return "@" .. match end
+ "!" * str / function(match) return "!" .. match end
+ "|" * str / function(match) return "|" .. match end)^0
print(idx:match("hello!world@foo|bar"))
$ lua test.lua
hello !world @foo |bar
Ответ на комментарий: Сбор совпадений в таблице.Матчи собраны в соответствии с их префиксом.
local lpeg = assert(require"lpeg")
local C, Ct, S = lpeg.C, lpeg.Ct, lpeg.S
local sep = S("@!|")
local str = C((1 - sep)^0)
local match = function(expr)
local prefix = function(prefix)
return function(match)
return prefix .. match
end
end
local idx = str * ( "@" * str / prefix("@")
+ "!" * str / prefix("!")
+ "|" * str / prefix("|"))^0
return Ct(idx):match(expr)
end
for _, str in ipairs{
"hello!world@foo|bar",
"foo@bar!baz baz@foobar!nice|crazy",
"foo@bar!baz@foobar!nice|crazy",
"Beamer-Template!navigation symbols@\\texttt {navigation symbols}"
} do
local t = match(str)
print(table.concat(t," "))
end
$ lua test.lua
hello !world @foo |bar
foo @bar !baz baz @foobar !nice |crazy
foo @bar !baz @foobar !nice |crazy
Beamer-Template !navigation symbols @\texttt {navigation symbols}