使用string.gmatch()按\n或\ r \n分割字符串

Nya*_*Cat 1 string lua lua-patterns

一个简单的模式应该做的工作,但我不能想出/找到有用的东西.我希望有这样的事情:

lines = string.gmatch(string, "^\r\n") 
Run Code Online (Sandbox Code Playgroud)

sis*_*oft 6

要将字符串拆分为表(数组),您可以使用以下内容:

str = "qwe\nasd\rzxc"
lines = {}
for s in str:gmatch("[^\r\n]+") do
    table.insert(lines, s)
end
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于“hello\n\nworld”:结果应该是三个字符串,其中之一是空字符串。 (3认同)

Hug*_*eth 6

重要的一点 - 用于gmatch删除分隔符的解决方案不匹配两个换行符之间的空字符串,因此如果您想像正常的拆分实现一样保留这些字符串(例如,比较两个文档之间的行),您最好匹配分隔符比如这个例子:

function string:split(delimiter)
  local result = { }
  local from  = 1
  local delim_from, delim_to = string.find( self, delimiter, from  )
  while delim_from do
    table.insert( result, string.sub( self, from , delim_from-1 ) )
    from  = delim_to + 1
    delim_from, delim_to = string.find( self, delimiter, from  )
  end
  table.insert( result, string.sub( self, from  ) )
  return result
end
Run Code Online (Sandbox Code Playgroud)

归功于 https://gist.github.com/jaredallard/ddb152179831dd23b230


Nya*_*Cat 2

我找到了答案:使用“[^\r\n]+”(“+”用于跳过空行)。

之前,我故意避免使用括号,因为我认为它表示不支持转义的特殊字符串文字。嗯,那是不正确的。这是双括号的作用。
Lua string.gsub() 按 '%s' 或 '\n' 模式