我正在使用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]=''
希望这会让我对我正在尝试做的事情有所了解。
答案 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