Lua中的n位模式匹配
我是卢阿的新手 假设我有一个字符串“1234567890” 我想迭代所有可能的3位数。(即12323434456…) 但这给了我输出Lua中的n位模式匹配,lua,pattern-matching,Lua,Pattern Matching,我是卢阿的新手 假设我有一个字符串“1234567890” 我想迭代所有可能的3位数。(即12323434456…) 但这给了我输出123456789 我应该使用什么样的模式 第二,一个相关的问题,我如何指定一个3位数的数字“%3d”似乎不起作用。“%d%d%d”是唯一的方法吗 注意:这没有标记为正则表达式,因为Lua没有RegExp。(至少在本地) 提前感谢:) 更新:正如Amber指出的,Lua中没有“重叠”匹配。关于第二个查询,我现在只能使用string.rep(“%d”,n),因为Lua
123456789
我应该使用什么样的模式
第二,一个相关的问题,我如何指定一个3位数的
数字<代码>“%3d”似乎不起作用。“%d%d%d”
是唯一的方法吗
注意:这没有标记为正则表达式,因为Lua没有RegExp。(至少在本地)
提前感谢:)
更新:正如Amber指出的,Lua中没有“重叠”匹配。关于第二个查询,我现在只能使用string.rep(“%d”,n)
,因为Lua不支持固定的重复次数。gmatch
从不返回重叠匹配(并且gsub
从不替换重叠匹配,fwiw)
您最好的选择可能是遍历所有可能的长度为3的子字符串,检查每个子字符串是否与3位数的模式匹配,如果匹配,则对其进行操作
(是的,%d%d
是编写它的唯一方法。Lua的缩写模式支持没有固定数量的重复语法。)核心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
s=“1234567890”
对于i=1,我们就这样做
m=s:匹配(“%d%d%d”,i)
如果是m,则打印(m)结束
结束
这将产生以下输出:
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
>
C:>Lua
Lua 5.1.4版权所有(C)1994-2008 Lua.org,临市局里约
>s=“1234567890”
>对于i=1,我们就这样做
>>m=s:匹配(“%d%d%d”,i)
>>如果是m,则打印(m)结束
>>结束
123
234
345
456
567
678
789
890
>
谢谢你,真不幸!你知道更简单的n位数模式吗?:)嘿,正如我编辑我的答案所提到的,Lua过于简单的模式匹配没有更简单的语法。我已经这样做了…:)但我想也许我应该选择一个更“Lua-ish”的解决方案。:)(“%d”):rep(n)
是编写对string.rep的调用的更惯用的方法。这是因为默认情况下,string
是所有字符串值的元表。
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
>