【问题标题】:Separate / count lines in a string分隔/计算字符串中的行
【发布时间】:2019-04-22 22:34:02
【问题描述】:

我目前正在用 Lua 为 computerCraft 编写一个概念验证文本编辑器;一项功能将是行计数。如何计算字符串中的行数,或者至少计算换行符? 理想情况下,显示器/终端的一侧也有行号,可以使用相同的代码。

我找不到任何足够好的搜索结果,如果已经回答,将不胜感激。

我不知道怎么做,理想的结果是一个数组,所有的文本行都分成不同的条目;这将解决这两个问题;但可能会出现更多“定制”选项

希望在帮助下我可以实现这样的输出...

1 |while true do
2 |sleep(0)
3 |write("Example")
4 |write("Script\n\n")
5 |end
:
PPPe Code Editor ~ 5 lines

...当有变化时刷新

【问题讨论】:

  • 只是一个提示,如果你还打算做语法高亮,你会想要更多的东西,而不仅仅是 gsub/strmatch very。我最终用纯 Lua 编写了一个 Lua 标记器,用于类似的用例。如果它在 ComputerCraft 中可用,请查看 LPEG。
  • 我会在某个时候用类似的东西制作一个更高级的版本,一旦我对显示功能有了更多的经验......! +ZX80s 没有语法高亮,他们的编辑器启发了我做这个(即使它更像 vi)............我会谷歌 LPeg :)

标签: lua computercraft


【解决方案1】:

您可以使用string.gsub,因为它会返回执行替换的次数作为第二个结果:

local _, replacements = string.gsub(text, "\n", "\n")

更新(2019 年 4 月 22 日):如果您需要为每行添加一个行号(最初的问题是关于行数),那么您仍然可以使用 string.gsub,但您需要提供计算行数的函数,例如:

lines = 1
local text = "1 |"..string.gsub(text, "\n", function(s) lines = lines + 1 return s..lines.." |" end)
print(text)
print(lines)

对于您的文本,这将打印:

1 |while true do
2 |sleep(0)
3 |write("Example")
4 |write("Script\n\n")
5 |end
5

【讨论】:

  • +1 是一个不错的 var,可以在每次显示刷新时打印,也是行数的一个很好的解决方案,但要花很多时间来进行行编号
【解决方案2】:

以字符串开头:

local str = "One sentence.\nAnother sentence.\nThe end."

然后:

local lines = {}
for line in (str):gmatch("[%a+%s]+") do 
    table.insert(lines, line) 
end

for i, line in ipairs(lines) do
    print("Line " .. i .. ": " .. line)
end

这将打印:

Line 1: One sentence.
Line 2: Another Sentence.
Line 3: The end.

您可能需要调整搜索模式以处理包含其他字符的行,但这对程序员来说是一个很好的练习。

【讨论】:

  • 这不会计算空行,甚至在您给出的示例中也无法正常工作,因为您的字符集中没有标点符号。
  • 这看起来像是一个解决方案,但柯蒂斯把我吓跑了:P
  • 这是一个解决方案,无需为您完成所有工作。我明确表示您需要调整搜索模式。这是给你指路。
  • 我会从这里拿东西
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
相关资源
最近更新 更多