在新行上拆分字符串,但包括空行

Split a string on new lines, but include empty lines

假设我有一个包含内容的字符串

local my_str = [[
line1
line2

line4
]]

我想得到以下 table:

{"line1","line2","","line4"}

换句话说,我希望空行 3 包含在我的结果中。我尝试了以下方法:

  local result = {};
  for line in string.gmatch(my_str, "[^\n]+") do
      table.insert(result, line);
  end

但是,这会产生一个不包含空行 3 的结果。

如何确保包含空行?我只是使用了错误的正则表达式吗?

试试这个:

  local result = {};
  for line in string.gmatch(my_str .. "\n", "(.-)\n") do
      table.insert(result, line);
  end

如果你不想要给你的那个空的第五个元素,那就去掉my_str末尾的空行,像这样:

local my_str = [[
line1
line2

line4]]

(请注意,长文本开头的换行符会被忽略,但末尾的换行符不会被忽略。)

您可以将 + 替换为 *,但这不适用于所有 Lua 版本; LuaJIT 会在您的结果中添加随机的空字符串(这在技术上什至没有错误)。

如果你的字符串总是在最后一行的末尾包含一个换行符,就像你的例子一样,你可以做类似 "([^\n]*)\n" 的事情来防止随机空字符串和最后一个空字符串。

在 Lua 5.2+ 中,您还可以只使用边界模式来检查换行符或字符串结尾:[^\n]*%f[\n[=14=]],但这在 [=25 中不起作用=]JIT 要么。

如果您需要支持 LuaJIT 并且 实际字符串中没有尾随换行符,那么您可以手动添加它:

string.gmatch(my_str .. "\n", "([^\n]*)\n")