lua中指定分隔符拆分字符串
2016-10-20 8:47:31
收藏:0
阅读:219
评论:3
我正在尝试创建一个在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
我尝试运行以下代码:
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
我得到的输出为:
1 a
2 b
3 c
4 d
5 e
6 f
无法找到哪里出现了错误...
点赞
用户1849746
下面是我常用的 split() 函数:
-- split("a,b,c", ",") => {"a", "b", "c"}
function split(s, sep)
local fields = {}
-- 如果没有传入分隔符,则默认以空格为分隔符
local sep = sep or " "
-- 构造分隔符匹配模式
local pattern = string.format("([^%s]+)", sep)
-- 使用 pattern 匹配 s,并将分割后的结果添加到 fields 数组中
string.gsub(s, pattern, function(c) fields[#fields + 1] = c end)
-- 返回结果数组
return fields
end
2016-10-21 15:30:24
用户4984564
"[^"..sep.."]*"..sep 这就是问题所在。你正在匹配一个由非分隔符字符组成并以分隔符结尾的字符串。然而,你要匹配的最后一个子字符串(g)并不是由分隔符字符而是由字符串结尾所结尾的。
最快解决此问题的方法是也将 \0 视为分隔符 ("[^"..sep.."\0]*"..sep),因为它代表了字符串的开始和/或结尾。这样,g 就算不是由分隔符而是由字符串结尾所结尾,仍会被视为匹配。
我认为你的方法总体上过于复杂;首先,你可以只匹配不包含分隔符的个别子字符串;其次,你可以在 for 循环中使用 gmatch 函数来实现。
local result = {}
for field in your_string:gsub(("[^%s]+"):format(your_separator)) do
table.insert(result, field)
end
return result
编辑:上面的代码可以更加简单:
local pattern = "[^%" .. your_separator .. "]+"
for field in string.gsub(your_string, pattern) do
-- ...and so on (其余部分应该很容易理解)
编辑 2:请记得你还需要对分隔符进行转义。如 % 这样的分隔符如果不转义为 %% 将会导致问题。
function escape(str)
return str:gsub("([%^%$%(%)%%%.%[%]%*%+%-%?])", "%%%1")
end
2016-10-22 11:09:21
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

当分割字符串时,避免边角情况的最简单方法是在你知道字符串不会以分隔符结尾时,将分隔符附加到字符串末尾:
str = "a,b,c,d,e,f,g" str = str .. ',' for w in str:gmatch("(.-),") do print(w) end或者,你可以使用包含可选分隔符的模式:
str = "a,b,c,d,e,f,g" for w in str:gmatch("([^,]+),?") do print(w) end实际上,由于我们正在捕获非分隔符,所以我们不需要可选分隔符:
str = "a,b,c,d,e,f,g" for w in str:gmatch("([^,]+)") do print(w) end