Разделить строку на разделитель и пробелы в Lua - PullRequest
0 голосов
/ 04 февраля 2019

Проблема

Я пытаюсь выделить синтаксис исходного кода Lua, поэтому я пытаюсь разбить строку кода на таблицу операторов, пробелов и имен переменных.

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

Пример:

"v1 *=3"

становится

{'v1', ' ', '*=', '3'}

Этот вопрос очень похож на Разделить строку и включить разделитель в Lua и Как разделить строку с несколькими разделителями в lua?

Однако мой вопрос отличается тем, что я хочу сохранить запись всех разделителей рядом друг с другом в одной записи, и я не могу создать правильный шаблон.

Что у меня естьпопробовал:

local delim = {",", ".", "(", ")", "=", "*"}
local s = "local variable1 *=get_something(5) if 5 == 4 then"
local p = "[^"..table.concat(delim).."%s]+"

for a in s:gsub(p, '\0%0\')gmatch'%Z+' do
    print(a)
end

Фактические результаты:

{'local', ' ', 'variable1', ' *=', 'get_something', '(', '5', ') ', 'if', ' ', '5', ' == ', '4', ' ', 'then'}

Ожидаемые результаты:

{'local', ' ', 'variable1', ' ', '*=', 'get_something', '(', '5', ')', ' ', 'if', ' ', '5', ' ', '==', ' ', '4', ' ', 'then'}

Это небольшая разница, ищите, где находятся пробелы, все связанные пробелыдолжно бытьв своей записи.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Через некоторое время я пришел к решению, просто разместив его здесь, если кому-то будет интересно.

local delim = {",", ".", "(", ")", "=", "*"}
local s = "local variable1 *=get_something(5) if 5 == 4 then"
local p = "[^"..table.concat(delim).."]+"

-- Split strings on the delimeters, but keep them as own entry
for a in s:gsub(p, '\0%0\')gmatch'%Z+' do

    -- Split strings on the spaces, but keep them as own entry
    for a2 in a:gsub("%s+", '\0%0\')gmatch'%Z+' do
        print(a2)
    end
end
0 голосов
/ 04 февраля 2019

РЕДАКТИРОВАТЬ Следующее, кажется, работает для всего, кроме *=.Все еще работает над этим, но вот код для большинства всего остального:

local delim = {"*=",",", ".", "(", ")", "=", " "}
local str = "local variable1 *=get_something(5) if 5 == 4 then"

local results = {}
local toutput = ""

function makeTable(str)
    for _,v in ipairs(delim) do
        str = str:gsub("([%"..v.."]+)", "`%1`")
    end
    for item in str:gmatch("[^`]+") do table.insert(results, item) end

    for _,v in ipairs(results) do
      toutput = toutput .. "'" .. v .. "',"
    end

    print("[" .. toutput .. "]")
end

makeTable(str)

Возвращает:

['local',' ','variable1',' ','*','=','get_something','(','5',')',' ','if',' ','5',' ','==',' ','4',' ','then',]

Надеюсь, это приблизит вас на один шаг.

...