我正在尝试在lua中使用分隔符创建一个split()函数,当默认为空格时.默认工作正常.当我给函数分隔符时,问题就开始了.由于某种原因,它不会返回最后一个子字符串.功能:
function split(str,sep)
if sep == nil then
words = {}
for word in str:gmatch("%w+") do table.insert(words, word) end
return words
end
return {str:match((str:gsub("[^"..sep.."]*"..sep, "([^"..sep.."]*)"..sep)))} -- BUG!! doesnt return last value
end
Run Code Online (Sandbox Code Playgroud)
我尝试运行这个:
local str = "a,b,c,d,e,f,g"
local sep = ","
t = split(str,sep)
for i,j in ipairs(t) do
print(i,j)
end
Run Code Online (Sandbox Code Playgroud)
我得到:
1 a
2 b
3 c
4 d
5 e
6 f
Run Code Online (Sandbox Code Playgroud)
无法弄清楚bug在哪里......
分割字符串时,避免极端情况的最简单方法是将分隔符附加到字符串,当您知道字符串不能以分隔符结束时:
str = "a,b,c,d,e,f,g"
str = str .. ','
for w in str:gmatch("(.-),") do print(w) end
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用带有可选分隔符的模式:
str = "a,b,c,d,e,f,g"
for w in str:gmatch("([^,]+),?") do print(w) end
Run Code Online (Sandbox Code Playgroud)
实际上,我们不需要可选的分隔符,因为我们正在捕获非分隔符:
str = "a,b,c,d,e,f,g"
for w in str:gmatch("([^,]+)") do print(w) end
Run Code Online (Sandbox Code Playgroud)
这是我的 split() 函数:
-- split("a,b,c", ",") => {"a", "b", "c"}
function split(s, sep)
local fields = {}
local sep = sep or " "
local pattern = string.format("([^%s]+)", sep)
string.gsub(s, pattern, function(c) fields[#fields + 1] = c end)
return fields
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7350 次 |
| 最近记录: |