使用嵌入式引号将原始字符串解析为带有lua的列表

时间:2017-05-01 21:13:37

标签: lua

通过指定分隔符来解析字符串很容易。有很多例子。但是,我在分割带有嵌入式双引号或单引号的原始字符串时遇到问题:

item1;item2 "x;y;z";item3 args='arg1;arg2;arg3';item4

在使用;作为分隔符进行拆分时,我希望得到以下结果:

item1
item2 "x;y;z"
item3 args='arg1;arg2;arg3'
item4

2 个答案:

答案 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