网上找的方法大多比较复杂,什么闭包,什么 gsub,我只要一个简单是字符串分割而已,索性自己写算了,面向搜索引擎编程罪恶感满满,我想当个真的程序员~~
方法一: 直接循环,根据索引截取字符串
--[[
str:要分割的字符串
dilimiter:分隔符
--]]
function split(str, dilimiter)
-- 声明准备要分割的子字符串的前后索引, 以及保存分割后的子字符串的 table
local frontIndex, backIndex, myTable = 0, 0, {}
while true do
-- 找到下一个要分割的字符串的索引位置
backIndex = string.find(str, dilimiter, frontIndex + 1)
-- 当查找到最后的时候 backIndex 将会是空的,就退出循环
if backIndex ~= nil then
table.insert(myTable, string.sub(str, frontIndex + 1, backIndex - 1))
else
table.insert(myTable, string.sub(str, frontIndex + 1))
return myTable
end
-- 把后面找到的分隔符的索引位置交换给 frontIndex,用于继续往下查找
frontIndex = backIndex
end
end
测试:
local str = ",1,142,2212,1"
resultArr = split(str, ',')
for i, v in ipairs(resultArr) do
print(i, v)
end
结果:
1
2 1
3 142
4 2212
5 1
方法二: 使用 gmatch() 方法匹配
function split2(str, dilimiter)
-- 用于保存找到的子字符串
local myTable = {}
-- str..dilimiter 的做法是在字符串最后加一个分隔符,不然找到的元素会少一个
for subStr in string.gmatch(str..dilimiter, "(.-)"..dilimiter) do
table.insert(myTable, subStr)
end
return myTable
end
测试:
s = "scm:1:123,scm:1:1,scm:1:142,scm:1:2212,scm:1:1,"
resultArr = split2(s, ',')
for i, v in ipairs(resultArr) do
print(i, v)
end
结果:
1 scm:1:123
2 scm:1:1
3 scm:1:142
4 scm:1:2212
5 scm:1:1
6
友情提示: 性能方面没有和其他的比较过,所以不太清楚,分割超长字符串的同学请注意哦~