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

问题

我想对一些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'}

这只是一个小差别,请查找空格的位置,所有连接的空格应该在它们自己的条目中。

点赞
用户308010
用户308010

编辑:以下方法对于除了 *= 之外的大多数情况都有效。我们还在考虑如何处理 *= 的情况,但是现在就先来为其他东西提供代码:

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

希望这可以让你更接近目标。

2019-02-04 15:33:59
用户7997500
用户7997500

一段时间后,我想出了一个解决方案,如果有人感兴趣就在这里发帖。

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

-- 分割字符串使用分隔符,但仍保留它们作为单独的条目
for a in s:gsub(p, '\0%0\')gmatch'%Z+' do

    -- 分割字符串使用空格,但仍保留它们作为单独的条目
    for a2 in a:gsub("%s+", '\0%0\')gmatch'%Z+' do
        print(a2)
    end
end
2019-02-19 22:26:10