st0*_*0le 5 lua pattern-matching
我是 Lua 新手。
假设我有一个字符串“1234567890”。
我想迭代所有可能的三位数。(IE 123,234,345,456....)
for m in string.gmatch("1234567890","%d%d%d") do
print (m)
end
Run Code Online (Sandbox Code Playgroud)
但这给了我输出123,456,789。
我应该使用什么样的模式?
其次,一个相关的问题,我如何指定一个3-digit数字?"%3d"似乎不起作用。是"%d%d%d"唯一的办法吗?
注意:这没有标记,Regular expression因为 Lua 没有 RegExp。(至少是原生的)
提前致谢 :)
更新:正如 Amber 指出的那样,Lua 中不存在“重叠”匹配。而且,关于第二个查询,我现在一直在使用,string.rep("%d",n)因为 Lua 不支持固定的重复次数。
你是对的,核心 Lua 不包含完整的正则表达式。该string模块理解的模式更简单,但足以满足很多情况。不幸的是,匹配重叠的 n 位数字并不是其中之一。
也就是说,您可以手动迭代字符串的长度并尝试在每个位置进行匹配,因为该string.match函数采用起始索引。例如:
s =“1234567890”
对于 i=1,#s 做
m = s:match("%d%d%d", i)
如果 m 则打印(m) 结束
结尾
这会产生以下输出:
C:>Lua
Lua 5.1.4 版权所有 (C) 1994-2008 Lua.org、PUC-Rio
> s =“1234567890”
> 对于 i=1,#s 做
>> m = s:match("%d%d%d", i)
>> 如果 m 那么 print(m) 结束
>> 结束
123
234
第345章
第456章
第567章
第678章
第789章
890
>
gmatch永远不会返回重叠的匹配(并且gsub永远不会替换重叠的匹配,fwiw)。
最好的选择可能是迭代所有可能的长度为 3 的子字符串,检查每个子字符串以查看它们是否与 3 位数字的模式匹配,如果是,则对它们进行操作。
(是的,%d%d%d这是唯一的编写方式。Lua 的缩写模式支持没有固定重复次数的语法。)