基于分隔符将字符串分解为子字符串,使用空子字符串

时间:2013-08-01 21:25:46

标签: lua lua-table

我正在使用LUA在表中创建一个表,并且遇到了问题。我还需要填充出现的NIL值,但似乎无法正确使用。

被操纵的字符串:

PatID = '07-26-27~L73F11341687Per^^^SCI^SP~N7N558300000Acc^'

for word in PatID:gmatch("[^\~w]+") do table.insert(PatIDTable,word) end
local _, PatIDCount = string.gsub(PatID,"~","")

PatIDTableB = {}
for i=1, PatIDCount+1 do
   PatIDTableB[i] = {}
end

for j=1, #PatIDTable do
 for word in PatIDTable[j]:gmatch("[^\^]+") do
  table.insert(PatIDTableB[j], word)         
 end
end

目前产生此输出:

table
[1]=table
 [1]='07-26-27'
[2]=table
 [1]='L73F11341687Per'
 [2]='SCI'
 [3]='SP'
[3]=table
 [1]='N7N558300000Acc'

但我需要它来制作:

table
[1]=table
 [1]='07-26-27'
[2]=table
 [1]='L73F11341687Per'
 [2]=''
 [3]=''
 [4]='SCI'
 [5]='SP'
[3]=table
 [1]='N7N558300000Acc'
 [2]=''

编辑: 我想我可能做了一个糟糕的工作,解释我在寻找什么。我不一定希望克拉被认为是“NIL”或“空”,而是说它们意味着要开始一个新的字符串。

我认为,由于缺乏更好的解释,位置标识符。

所以,例如:

L73F11341687Per^^^SCI^SP 

实际上翻译为:

1. L73F11341687Per
2. 
3. 
4. SCI
5. SP

如果我有

L73F11341687Per^12ABC^^SCI^SP

然后这些职位是:

1. L73F11341687Per
2. 12ABC
3. 
4. SCI
5. SP

反过来,表格将是:

table
[1]=table
 [1]='07-26-27'
[2]=table
 [1]='L73F11341687Per'
 [2]='12ABC'
 [3]=''
 [4]='SCI'
 [5]='SP'
[3]=table
 [1]='N7N558300000Acc'
 [2]=''

希望这会让我对我正在尝试做的事情有所了解。

2 个答案:

答案 0 :(得分:1)

现在我们已经解决了问题所在,这就是问题所在。

您的gmatch模式将返回给定字符串中的所有匹配子字符串。但是,您的gmatch模式使用“+”。这意味着“一个或多个”,因此不能匹配空字符串。如果它遇到^个字符,它就会跳过它。

但是,如果您只是尝试:gmatch("[^\^]*"),它允许空匹配,问题是它会有效地将每个^字符转换为空匹配。这不是你想要的。

你想要的是在子串的末尾吃^。但是,如果你尝试:gmatch("([^\^])\^"),你会发现它不会返回最后一个字符串。这是因为最后一个字符串不以^结尾,因此它不是有效匹配。

gmatch最接近的是这种模式:"([^\^]*)\^?"。这有一个缺点就是在最后放一个空字符串。但是,你可以很容易地删除它,因为总会把它放在那里。

答案 1 :(得分:0)

local s0 = '07-26-27~L73F11341687Per^^^SCI^SP~N7N558300000Acc^'

local tt = {}
for s1 in (s0..'~'):gmatch'(.-)~' do
    local t = {}
    for s2 in (s1..'^'):gmatch'(.-)^' do
        table.insert(t, s2)
    end
    table.insert(tt, t)
end