Lua中的n位模式匹配

我是 Lua 的新手。

假设我有一个字符串 "1234567890"。

我想遍历所有可能的 3 位数字(例如 123、234、345、456....)。

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

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

我应该使用什么样的模式?

其次,一个相关的问题,我如何指定一个“3 位数字”?"%3d" 似乎不起作用。"%d%d%d" 是唯一的方法吗?

说明:这个问题没有被标记为 Regular expression,因为 Lua 没有 RegExp。(至少本机没有)

提前感谢:)

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

原文链接 https://stackoverflow.com/questions/3952360

点赞
stackoverflow用户148870
stackoverflow用户148870

gmatch 从不返回重叠匹配(而gsub永远不会替换重叠匹配,顺便说一句)。

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

(是的,%d%d%d 是唯一的写法。Lua的简写模式支持没有固定数量重复语法。)

2010-10-17 07:20:46
stackoverflow用户68204
stackoverflow用户68204

您是正确的,核心的 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
>
2010-10-17 22:14:31