在Lua中的分隔符和空格上分割字符串

时间:2019-02-04 13:51:27

标签: string split lua delimiter

问题

我试图用语法突出显示一些Lua源代码,因此我试图将一串代码拆分为一个运算符,空格字符和变量名的表。

麻烦是:我有一个包含多个分隔符的表,我想在这些分隔符上拆分字符串,但还要保留一个分隔符和所有连接的空格字符的条目:

示例:

"v1 *=3"

成为

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

这个问题非常类似于 Split String and Include Delimiter in LuaHow do I split a string with multiple separators in 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 :(得分:1)

编辑以下内容似乎适用于*=以外的所有内容。仍在处理此问题,但这是大多数其他代码:

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',]

希望这可以使您更近一步。

答案 1 :(得分:0)

一段时间后,我想出一个解决方案,如果有人对此感兴趣,只需将其发布在这里。

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