[решено] lua соответствует всему после тега в строке - PullRequest
0 голосов
/ 25 января 2020

Строка выглядит следующим образом: TEMPLATES = "! $ TEMPLATE режим модели производителя имени шаблона \ n $ TEMPLATE MacQuantum Wa sh Basic \ n $$ ПРОИЗВОДИТЕЛЬ Martin \ n $$ MODELNAME Ma c Quantum Wash \ n $$ MODENAME Basic \ n "

Мой способ получить строки без тегов:

    local sentence=""
    for word in string.gmatch(line,"%S+") do
      if word ~= tag then
        sentence=sentence .. word.." "
      end              
    end
    table.insert(tagValues, sentence)
    E(tag .." --> "..sentence)

И я получаю вывод:

$$MANUFACTURER --> Martin 
$$MODELNAME --> Mac Quantum Wash 
... 
...

Но это не тот способ, которым я подобно. Я хотел бы сначала найти блок, начинающийся с тега $ TEMPLATE, чтобы проверить, является ли этот блок правильным. В файле, который я читаю построчно, много таких блоков. Затем я должен получить все теги, помеченные двойным $: $$ MODELNAME et c. Я пробовал это по-разному, но никто не удовлетворил меня. Возможно, у кого-то есть идеи, как это решить?

1 Ответ

1 голос
/ 25 января 2020

Мы собираемся использовать Lua шаблонов (как регулярное выражение, но другое) внутри функции string.gmatch, которая создает al oop. Объяснение: for match in string.gmatch(string, pattern) do print(match) end - это итеративная функция, которая будет повторять каждый экземпляр pattern в string. Шаблон, который я буду использовать: %$+%w+%s[^\n]+

%$+ - Минимум 1 литерал $ ($ - специальный символ, поэтому для выхода требуется%), + означает 1 или более. Вы можете найти только один ("% $"), если вам нужны только данные тега, но нам нужна информация о количестве $, поэтому мы оставим это в.

%w+ - совпадение любой символ алфавита c, столько, сколько появляется в строке.

%s - соответствует одному пробелу

[^\n]+ - соответствует любому, что не является \ n (^ означает инверсию), столько, сколько появляется в строке. Как только функция нажимает \ n, она выполняет l oop для совпадения и повторяет процесс.

Это оставляет нам строки типа "$ TEMPLATE templatename Manufacturer". Мы хотим извлечь $ TEMPLATE в его собственная переменная для проверки, поэтому мы используем string.match(string, pattern), чтобы просто вернуть значение, найденное шаблоном в строке.

ОК: РЕДАКТИРОВАТЬ: Вот полный пример, который должен предоставить все, что вы ищете.

templates = "!$TEMPLATE templatename manufacturer model mode\n$TEMPLATE MacQuantum Wash Basic\n$$MANUFACTURER Martin\n$$MODELNAME Mac Quantum Wash\n$$MODENAME Basic\n"

local data = {}
for match in string.gmatch(templates, "%$+%w+%s[^\n]+") do --finds the pattern given in the variable 'templates'
  --this function assigns certain data to tags inside table t, which goes inside data.
 local t = {}
 t.tag = string.match(match, '%w+')  --the tag (stuff that comes between a $ and a space)
 t.info = string.gsub(match, '%$+%w+%s', "") --value of the tag (stuff that comes after the `$TEMPLATE `. Explanation: %$+ one or more dollar signs $w+ one or more alphanumeric characters $s a space. Replace with "" (erase it)
 _, t.ds = string.gsub(match, '%$', "") --This function emits two values, the first one is garbage and we don't need (hence a blank variable, _). The second is the number of $s in the string).
 table.insert(data, t)
end
for _,tag in pairs(data) do     --iterate over every table of data in data.
 for key, value in pairs(tag) do
  print("Key:", key, "Value:", value) --this will show you data examples (see output)
 end
 print("-------------")
end

print('--just print the stuff with two dollar signs')
for key, data in pairs(data) do
 if data.ds == 2 then --'data' becomes a subtable in table 'data', we evaluate how many dollar signs it recognized.
  print(data.tag)
 end
end

print("--just print the MODELNAME tag's value")
for key, data in pairs(data) do
 if data.tag == "MODELNAME" then --evaluate the tag name.
  print(data.info)
 end
end

Вывод:

Key:    info    Value:  templatename manufacturer model mode
Key:    ds  Value:  1
Key:    tag Value:  TEMPLATE
-------------
Key:    info    Value:  MacQuantum Wash Basic
Key:    ds  Value:  1
Key:    tag Value:  TEMPLATE
-------------
Key:    info    Value:  Martin
Key:    ds  Value:  2
Key:    tag Value:  MANUFACTURER
-------------
Key:    info    Value:  Mac Quantum Wash
Key:    ds  Value:  2
Key:    tag Value:  MODELNAME
-------------
Key:    info    Value:  Basic
Key:    ds  Value:  2
Key:    tag Value:  MODENAME
-------------
--just print the stuff with two dollar signs
MANUFACTURER
MODELNAME
MODENAME
--just print the MODELNAME tag's value:
Mac Quantum Wash
...