通过指定分隔符来解析字符串很容易。有很多例子。但是,我在分割带有嵌入式双引号或单引号的原始字符串时遇到问题:
item1;item2 "x;y;z";item3 args='arg1;arg2;arg3';item4
在使用;
作为分隔符进行拆分时,我希望得到以下结果:
item1
item2 "x;y;z"
item3 args='arg1;arg2;arg3'
item4
答案 0 :(得分:2)
您也可以采用'旧式'方式,即没有内置模式匹配:
function parse(s,target)
local line = ''
local quote
for c = 1,#s do
c = s:sub(c,c)
if c == quote then
quote = nil
elseif quote == nil and (c == '"' or c == "'") then
quote = c
end
if quote or c ~= target then
line = line .. c
else
print(line)
line = ''
end
end
print(line)
end
local s = [[item1;item2 "x;y;z";item3 args='arg1;arg2;arg3';item4]]
parse(s,';')
答案 1 :(得分:1)
local str = [[item1;item2 "x;y;z";item3 args='arg1;arg2;arg3';;item5]]
for part in ('""'..str..';')
:gsub(
"((['\"]).-%2)([^'\"]*)",
function(q, _, u) return q..u:gsub(";", "\0") end)
:sub(3)
:gmatch"(%Z*)%z"
do
print(part)
end