Lua: получить подстроку - PullRequest
       13

Lua: получить подстроку

0 голосов
/ 08 октября 2018

У меня есть, например,

str = "Beamer-Template!navigation symbols@\\texttt {navigation symbols}"
print(str:gsub('[^!|@%s]+@', ''))

, который печатает

Beamer-Template!navigation \texttt {navigation symbols}

, но это должно быть

Beamer-Template!\texttt {navigation symbols}

Как я могу поймать пространство?Важным является только foo@bar.Шаблон отлично работает для таких строк, как

str="foo@bar!baz@foobar!nice|crazy"
-> bar!foobar!nice|crazy

, но не с дополнительным пробелом

str="foo@bar!baz baz@foobar!nice|crazy"
-> bar!baz foobar!nice|crazy

, который должен быть bar!foobar!nice|crazy

1 Ответ

0 голосов
/ 09 октября 2018

Для сопоставления 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}
...