разбиение строк lua ​​на переменные

Я довольно новичок в этом, поэтому я надеюсь, что вы можете помочь мне.

Я программирую свет, и мне нравится брать переменную с моего стола освещения (текстовая строка под названием «4 Mythos Stage») и разделять ее на разные переменные.

чтобы получить переменные со стола, который я использую:

return function ()
local Layer1 = gma.user.getvar("Layer1") -- I placed "4 Mythos Stage" variable in Layer1
gma.feedback(Layer1) -- gives feedback 4 Mythos Stage
end

Теперь я хотел бы разбить строку на 3 новые локальные переменные с именами:

local number -- should produce 4
local fixturetype -- should produce Mythos
local location -- should produce Stage

я попробовал следующее:

local number = string.match('Layer1', '%d+')
local fixturetype = string.match('Layer1', '%a+')
local location = string.match('Layer1', '%a+')

это не сработало, так что может кто-нибудь помочь мне в правильном направлении. Я был бы очень признателен.

С наилучшими пожеланиями,

Мартин


person Martijn van Dam    schedule 04.04.2018    source источник


Ответы (2)


Вы можете присвоить все три переменные одновременно, потому что Lua имеет несколько возвратов и множественное присваивание. Поместите скобки вокруг каждого из ваших шаблонов, чтобы вернуть их как захваты, и объедините их в один шаблон с пробелами между ними:

local number, fixturetype, location = string.match(Layer1, '(%d+) (%a+) (%a+)')

Если вы будете использовать несколько пробелов или табуляций между элементами, этот шаблон будет лучше:

local number, fixturetype, location = string.match(Layer1, '(%d+)[ \t]+(%a+)[ \t]+(%a+)')

Причина, по которой ваша попытка не сработала, заключается в том, что string.match('Layer1', '%d+') ищет внутри 'Layer1' (строка), а не Layer1 (переменная).

Но даже если вы это исправите, вы будете получать 'Mythos' каждый раз, когда будете звонить string.match(Layer1, '%a+') (где Layer1 == '4 Mythos Stage'). string.match всегда начинается с начала строки, если вы не укажете индекс в третьем параметре: string.match(Layer1, '%a+', 9) --> 'Stage'.

person cyclaminist    schedule 04.04.2018
comment
да, это сработало. Потрясающие. спасибо за быстрый ответ Цикламинист - person Martijn van Dam; 05.04.2018
comment
Используйте %s вместо [ \t]. - person lhf; 05.04.2018
comment
Я полагаю, что %s лучше. Я не хотел сопоставлять символы новой строки (хотя в приведенном примере это не имеет значения). - person cyclaminist; 05.04.2018

Надежное решение этой задачи состоит в том, чтобы разбить строку на три «слова», где слово представляет собой последовательность непробельных символов:

local number, fixturetype, location = string.match(Layer1, '(%S+)%s+(%S+)%s+(%S+)')
person lhf    schedule 05.04.2018