Lua中的n位模式匹配

时间:2010-10-17 07:11:18

标签: lua pattern-matching

我是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不支持固定数量的重复。

2 个答案:

答案 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
>
相关问题