【问题标题】:n-digit Pattern Matching in LuaLua 中的 n 位模式匹配
【发布时间】:2012-09-07 20:06:17
【问题描述】:

我是 Lua 的新手。

假设我有一个字符串“1234567890”。

我想遍历所有可能的 3 位数字。 (即123,234,345,456....

for m in string.gmatch("1234567890","%d%d%d") do
      print (m)
end

但这给了我输出123,456,789

我应该使用哪种模式?

其次,一个相关的问题,我如何指定3-digit 号码? "%3d" 似乎不起作用。 "%d%d%d"是唯一的方法吗?

注意:这没有被标记为Regular expression因为 Lua 没有 RegExp。 (至少在本地)

提前致谢:)

更新:正如 Amber 指出的那样,Lua 中没有“重叠”匹配。而且,关于第二个查询,我现在卡在使用 string.rep("%d",n),因为 Lua 不支持固定数量的重复。

【问题讨论】:

  • ("%d"):rep(n) 是对string.rep 的调用的更惯用方式。它之所以有效,是因为string 默认情况下是所有字符串值的元表。

标签: lua pattern-matching


【解决方案1】:

gmatch 永远不会返回重叠匹配项(并且gsub 永远不会替换重叠匹配项,fwiw)。

您最好的选择可能是遍历所有可能的长度为 3 的子字符串,检查每个子字符串以查看它们是否与 3 位数字的模式匹配,如果匹配,则对它们进行操作。

(是的,%d%d%d 是编写它的唯一方法。Lua 的缩写模式支持没有固定重复次数的语法。)

【讨论】:

  • 谢谢你,太不幸了!您对更简单的 n 位模式有任何想法吗? :)
  • 嘿,正如我编辑我的答案提到的,Lua 的简单模式匹配没有更简单的语法。
  • 我已经这样做了...:) 但我想也许我应该寻求一个更“Lua-ish”的解决方案。 :)
【解决方案2】:

您是正确的,核心 Lua 不包含完整的正则表达式。 string 模块理解的模式更简单,但对于很多情况来说已经足够了。不幸的是,匹配重叠的 n 位数字不是其中之一。

也就是说,您可以手动迭代字符串的长度并尝试在每个位置进行匹配,因为string.match 函数采用起始索引。例如:

s = "1234567890" 对于 i=1,#s 做 m = s:match("%d%d%d", i) 如果 m 则 print(m) 结束 结尾

这会产生以下输出:

C:>Lua Lua 5.1.4 版权所有 (C) 1994-2008 Lua.org, PUC-Rio > s = "1234567890" > for i=1,#s 做 >> m = s:match("%d%d%d", i) >> 如果 m 则 print(m) 结束 >> 结束 123 234 345 456 567 678 789 890 >

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 2015-07-02
    • 2011-02-03
    • 2019-03-29
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    相关资源
    最近更新 更多