如何删除Lua中字符串的最后一行



我在魔兽世界中使用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样式换行符的字符串,如果您有nrrn,则更简单的解决方案将是一种模式。

此解决方案对于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."))

代码的工作方式

  1. str自变量中的字母将被提取到一个表中("Hello"将变为{"H", "e", "l", "l", "o"}(

  2. i本地设置在表的末尾,因为我们从后到前扫描它

  3. 检查letters[i]是否为\n如果是换行符,则转到步骤7

  4. 删除letters[i]上的条目

  5. 带1个的负i

  6. 转到步骤3直到i为零如果i为零则转到步骤8

  7. 删除letters[i]处的条目,因为在检查换行时该条目尚未删除

  8. 返回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

相关内容

  • 没有找到相关文章

最新更新