Я работал над этой частью системы saycommand, которая должна отделять части строки и помещать их в таблицу, которая отправляется функции, запрашиваемой в начале строки. Это будет выглядеть, например, как !save 1
или !teleport 0 1
или !tell 5 "a private message"
.
Я хотел бы, чтобы эта строка превратилась в таблицу:
[[1 2 word 2 9 'more words' 1 "and more" "1 2 34"]]
(Каждая часть строки без кавычек получает свой собственный ключ, а части в кавычках группируются в ключ)
1 = 1
2 = 2
3 = word
4 = 2
5 = 9
6 = more words
7 = 1
8 = and more
9 = 1 2 34
Я пытался сделать это с помощью шаблона Lua, но я застрял, пытаясь выяснить, как захватить части строки как в кавычках, так и без кавычек. Я много чего перепробовал, но ничего не помогло.
Мои текущие попытки шаблона выглядят так:
a, d = '1 2 word 2 9 "more words" 1 "and more" "1 2 34"" ', {}
-- previous attempts
--[[
This one captures quotes
a:gsub('(["\'])(.-)%1', function(a, b) table.insert(d, b) end)
This one captures some values and butchered quotes,
which might have to do with spaces in the string
a:gsub('(["%s])(.-)%1', function(a, b) table.insert(d, b) end)
This one captures every value, but doesn't take care of quotes
a:gsub('(%w+)', function(a) table.insert(d, a) end)
This one tries making %s inside of quotes into underscores to
ignore them there, but it doesn't work
a = a:gsub('([%w"\']+)', '%1_')
a:gsub('(["\'_])(.-)%1', function(a, b) table.insert(d, b) end)
a:gsub('([%w_]+)', function(a) table.insert(d, a) end)
This one was a wild attempt at cracking it, but no success
a:gsub('["\']([^"\']-)["\'%s]', function(a) table.insert(d, a) end)
--]]
-- This one adds spaces, which would later be trimmed off, to test
-- whether it helped with the butchered strings, but it doesn't
a = a:gsub('(%w)(%s)(%w)', '%1%2%2%3')
a:gsub('(["\'%s])(.-)%1', function(a, b) table.insert(d, b) end)
for k, v in pairs(d) do
print(k..' = '..v)
end
Это не нужно для простых команд, но для более сложных, таких как !tell 1 2 3 4 5 "a private message sent to five people"
, это необходимо, во-первых, чтобы проверить, отправлено ли оно нескольким людям, а затем, чтобы узнать, что это за сообщение.
В дальнейшем я хочу добавить такие команды, как !give 1 2 3 "component:material_iron:weapontype" "food:calories"
, которые должны добавлять два элемента трем разным людям, что принесет большую пользу от такой системы.
Если это невозможно в шаблоне Lua, я попробую сделать это с помощью циклов for и тому подобного, но я действительно чувствую, что упускаю что-то очевидное. Я слишком много думаю об этом?