【问题标题】:Lua: gmatch multi line string?Lua:gmatch多行字符串?
【发布时间】:2017-07-18 07:43:56
【问题描述】:

我正在尝试创建一个函数来搜索一些代码以查找搜索词所在的行以及该行的索引。该代码是带有换行符的多行字符串。我正在考虑使用 gmatch 来执行此操作,但我不知道如何。

这是我目前的代码。这很糟糕,但我想不出办法让它变得更好:

local function search( code, term )
  local matches = {}
  local i = 0
  for line in string.gmatch( code, "[^\r\n]+" ) do
    i = i + 1
    if string.find( line, term, 1, true ) then
      table.insert( matches, { line = i, code = line } )
    end
  end
  return matches
end

任何帮助将不胜感激!

【问题讨论】:

  • 正确计算空行数:for line in string.gmatch( code, "([^\r\n]*)\r?\n?" ) do
  • 为什么你觉得这段代码很糟糕?
  • @lhf 它逐行遍历每一行,只是为了查看其中一行是否有正确的字符串,而不是从整体上看这些行,我觉得它可以,因为它是单个字符串。另外,我加 1 的部分感觉不对。循环时我习惯了k和v。

标签: lua string-matching


【解决方案1】:

您的解决方案对我来说似乎很好。使用单个 gmactch 循环的问题是您需要报告行号。下面的代码通过将行号嵌入到代码中来避免这种情况。我使用@ 来标记行号。您可以使用任何未出现在源代码中的字符,甚至像 \0 这样的字符。

function search(code,term)
    for a,b in code:gmatch("@(%d+):([^\n]-"..term.."[^\n]-)\n") do
        print(a)
        print(b)
    end
end

local n=0
code="\n"..code
code=code:gsub("\n", function () n=n+1 return "\n@"..n..":" end)

search(code,"matc")

【讨论】:

    猜你喜欢
    • 2013-10-23
    • 2021-10-08
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多