我试图用语法突出显示一些Lua源代码,因此我试图将一串代码拆分为一个运算符,空格字符和变量名的表。
麻烦是:我有一个包含多个分隔符的表,我想在这些分隔符上拆分字符串,但还要保留一个分隔符和所有连接的空格字符的条目:
示例:
"v1 *=3"
成为
{'v1', ' ', '*=', '3'}
这个问题非常类似于 Split String and Include Delimiter in Lua 和 How 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'}
差别很小,要查找空格在哪里,所有连接的空格都应该在自己的条目中。
答案 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