我在魔兽世界中使用Lua。
我有这个字符串:
"Thisnisnmynlife."
因此,当打印时,输出是这样的:
This
is
my
life.
如何将除最后一行外的整个字符串存储在新变量中?
所以我希望新变量的输出是这样的:
This
is
my
我希望Lua代码找到最后一行(不管字符串中有多少行(,删除最后一行,并将剩余的行存储在一个新变量中。
谢谢。
所以我发现Egor Skcriptunoff在评论中的解决方案确实很好,但我无法将他的评论标记为答案,所以我将把他的答案放在这里。
这将删除最后一行,并将剩余行存储在一个新变量中:
new_str = old_str:gsub("n[^n]*$", "")
如果最后一行的末尾有一个新的换行符,Egor将其作为解决方案发布:
new_str = old_str:gsub("n[^n]*(n?)$", "%1")
同时删除第一行并将剩余行存储在一个新变量中:
first_line = old_str:match("[^n]*")
谢谢你的帮助,埃戈尔。
最有效的解决方案是普通字符串.find.
local s = "Thisnisnmynlife." -- string with newlines
local s1 = "Thisismylife." -- string without newlines
local function RemoveLastLine(str)
local pos = 0 -- start position
while true do -- loop for searching newlines
local nl = string.find(str, "n", pos, true) -- find next newline, true indicates we use plain search, this speeds up on LuaJIT.
if not nl then break end -- We didn't find any newline or no newlines left.
pos = nl + 1 -- Save newline position, + 1 is necessary to avoid infinite loop of scanning the same newline, so we search for newlines __after__ this character
end
if pos == 0 then return str end -- If didn't find any newline, return original string
return string.sub(str, 1, pos - 2) -- Return substring from the beginning of the string up to last newline (- 2 returns new string without the last newline itself
end
print(RemoveLastLine(s))
print(RemoveLastLine(s1))
请记住,这只适用于具有n
样式换行符的字符串,如果您有nr
或rn
,则更简单的解决方案将是一种模式。
此解决方案对于LuaJIT和长字符串来说是有效的。对于小字符串,string.sub(s1, 1, string.find(s1,"n[^n]*$") - 1)
是可以的(不适用于LuaJIT tho(。
我向后扫描,因为向后扫描比向前扫描更容易从后面移除东西,如果向前扫描,则会更复杂,向后扫描也更简单
我一次成功
function removeLastLine(str) --It will return empty string when there just 1 line
local letters = {}
for let in string.gmatch(str, ".") do --Extract letter by letter to a table
table.insert(letters, let)
end
local i = #letters --We're scanning backward
while i >= 0 do --Scan from bacward
if letters[i] == "n" then
letters[i] = nil
break
end
letters[i] = nil --Remove letter from letters table
i = i - 1
end
return table.concat(letters)
end
print("Thisnisnmynlife.")
print(removeLastLine("Thisnisnmynlife."))
代码的工作方式
str
自变量中的字母将被提取到一个表中("Hello"
将变为{"H", "e", "l", "l", "o"}
(i
本地设置在表的末尾,因为我们从后到前扫描它检查
letters[i]
是否为\n如果是换行符,则转到步骤7删除
letters[i]
上的条目带1个的负
i
转到步骤3直到
i
为零如果i
为零则转到步骤8删除
letters[i]
处的条目,因为在检查换行时该条目尚未删除返回
table.concat(letters)
。不会导致错误,因为如果表为空,table.concat
返回空字符串
#! /usr/bin/env lua
local serif = "Is this thenreal life?nIs thisnjust fantasy?"
local reversed = serif :reverse() -- flip it
local pos = reversed :find( 'n' ) +1 -- count backwards
local sans_serif = serif :sub( 1, -pos ) -- strip it
print( sans_serif )
如果你愿意的话,你可以把它排成一行,同样的结果。
local str = "Is this thenreal life?nIs thisnjust fantasy?"
print( str :sub( 1, -str :reverse() :find( 'n' ) -1 ) )
Is this the
real life?
Is this