如何在 Lua 中删除字符串的最后一行?
我在魔兽世界中使用 Lua。
我有这个字符串:
"This\nis\nmy\nlife."
因此,当打印时,输出如下:
This
is
my
life.
如何将整个字符串存储在一个新变量中,但排除最后一行?
因此,我希望新变量的输出如下所示:
This
is
my
我想要 Lua 代码查找最后一行(无论字符串中有多少行),删除最后一行并将剩余行存储在新变量中。
谢谢。
最高效的解决方案是使用纯字符串查找。
local s = "This\nis\nmy\nlife." -- 带有换行符的字符串
local s1 = "Thisismylife." -- 不带换行符的字符串
local function RemoveLastLine(str)
local pos = 0 -- 起始位置
while true do -- 寻找换行符的循环
local nl = string.find(str, "\n", pos, true) -- 查找下一个换行符,true 表示我们使用纯查找,这在 LuaJIT 上会加速。
if not nl then break end -- 没有找到换行符或没有剩余的换行符。
pos = nl + 1 -- 保存换行符位置,+1 是必要的,以避免无限循环扫描相同的换行符,因此我们在该字符之后搜索新的换行符。
end
if pos == 0 then return str end -- 如果没有找到任何换行符,则返回原始字符串
return string.sub(str, 1, pos - 2) -- 返回从字符串开头到最后一个换行符的子字符串(-2 返回没有最后一个换行符的新字符串)
end
print(RemoveLastLine(s))
print(RemoveLastLine(s1))
请记住,这只适用于具有 \n 样式换行符的字符串,如果您有 \n\r 或 \r\n,更简单的解决方案是使用模式匹配。
对于 LuaJIT 和长字符串,此解决方案非常高效。
对于小字符串,string.sub(s1, 1, string.find(s1,"\n[^\n]*$") - 1) 就可以了(但在 LuaJIT 上不行)。
所以我发现 Egor Skriptunoff 的解决方案在评论中非常有效,但是我无法将他的评论标记为答案,所以我会在此处放置他的答案。
这将删除最后一行并将剩余行存储在一个新变量中:
new_str = old_str:gsub("\n[^\n]*$", "")
如果在最后一行末尾有一个换行符,Egor 提供了以下解决方法:
new_str = old_str:gsub("\n[^\n]*(\n?)$", "%1")
而这将删除第一行,并将剩余行存储在一个新变量中:
first_line = old_str:match("[^\n]*")
感谢您的帮助,Egor。
我将它反向扫描是因为在后面移除东西比前面更容易,如果你向前扫描,那么它会更复杂,而向后扫描会更简单。
我一次成功了
function removeLastLine(str) --当只有 1 行时,它将返回空字符串
local letters = {}
for let in string.gmatch(str, ".") do --逐个字母将其提取到一个表中
table.insert(letters, let)
end
local i = #letters --我们从后往前扫描
while i >= 0 do --从后往前扫描
if letters[i] == "\n" then
letters[i] = nil
break
end
letters[i] = nil --从字母表中移除字母
i = i - 1
end
return table.concat(letters)
end
print("This\nis\nmy\nlife.")
print(removeLastLine("This\nis\nmy\nlife."))
代码的工作原理
参数
str中的字母将被提取到一个表中("Hello"将变成{"H", "e", "l", "l", "o"})将
i局部变量设置为表的末尾,因为我们将从后往前扫描检查
letters[i]是否是 \n 如果是,则转到步骤 7删除
letters[i]中的条目将
i减 1重复步骤 3 直到
i为零,如果i为零,则转到步骤 8移除
letters[i]中的条目,因为在检查换行符时还没有移除返回
table.concat(letters)。如果表为空,则不会导致错误,因为table.concat将返回空字符串
- 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 代码?

#! /usr/bin/env lua local serif = "Is this the\nreal life?\nIs this\njust fantasy?" local reversed = serif :reverse() -- 翻转它 local pos = reversed :find( '\n' ) +1 -- 倒序计数 local sans_serif = serif :sub( 1, -pos ) -- 去掉它 print( sans_serif )如果你愿意,你可以把它压成一行,结果一样。
local str = "Is this the\nreal life?\nIs this\njust fantasy?" print( str :sub( 1, -str :reverse() :find( '\n' ) -1 ) )Is this thereal life?Is this