我是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不支持固定数量的重复。
答案 0 :(得分:4)
gmatch
永远不会返回重叠匹配(并且gsub
永远不会替换重叠匹配,fwiw)。
您最好的选择可能是迭代所有可能的长度为3的子串,检查每个子串以查看它们是否与3位数字的模式匹配,如果是,则对它们进行操作。
(是的,%d%d%d
是写它的唯一方法.Lua的缩写模式支持没有固定的重复次数语法。)
答案 1 :(得分:4)
核心Lua不包含完整的正则表达式是正确的。 string
模块理解的模式更简单,但在很多情况下都足够了。遗憾的是,匹配重叠的n位数不是其中之一。
也就是说,您可以手动迭代字符串的长度并在每个位置尝试匹配,因为string.match
函数采用起始索引。例如:
s = "1234567890" for i=1,#s do m = s:match("%d%d%d", i) if m then print(m) end end
这会产生以下输出:
C:>Lua Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio > s = "1234567890" > for i=1,#s do >> m = s:match("%d%d%d", i) >> if m then print(m) end >> end 123 234 345 456 567 678 789 890 >