0

我正在使用 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]=''

编辑:我想我可能在解释我在寻找什么方面做得不好。我不一定希望将 karats 视为“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]=''

希望这对我正在尝试做的事情有更多的了解。

4

2 回答 2

1

既然我们已经弄清楚了问题的含义,那就是问题所在。

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

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

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

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

于 2013-08-01T21:31:44.627 回答
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
于 2013-08-02T00:34:08.760 回答