根据分隔符将字符串分割成子字符串,允许出现空子字符串。

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

希望这能更清楚地说明我想做什么。

点赞
用户734069
用户734069

现在我们已经澄清了问题,下面是问题所在。

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

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

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

你可以通过 gmatch 得到的最接近模式是:"([^\^]*)\^?"。这样做的缺点是在末尾放置了一个空字符串。然而,你可以很容易地删除它,因为它总是放在那里。

2013-08-01 21:31:44
用户1847592
用户1847592
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

将字符串s0按照~进行分割,得到字符串数组s1,再将每个字符串按照^进行分割,得到字符串数组t,将t添加到二维数组tt中。

2013-08-02 00:34:08