在Lua中匹配模式

3

我正在尝试匹配一个长度为9个字符的字符串,该字符串始终包含数字。

我要匹配的模式是查看字符串是否全为0或全为1或全为2,以此类推,直到全为9。

有人能帮我写这个吗?我只考虑了0和9,并将其硬编码,它可以正常工作。但肯定有更简单的方法。

请有人帮忙吗?


2
如果您的模式集是有界限的(并且不太可能发生变化),那么查找表几乎肯定是最佳解决方案。正则表达式可以(通过交替和有限重复)相当清晰地表达这些模式。但是,Lua模式无法做到这一点。我能想到的“最聪明”的非硬编码想法是匹配九个数字,然后获取第一个数字并搜索字符串中除该数字外的任何内容。 - Etan Reisner
Etan,这是我想采取的方法之一,但我在等待是否有其他可能的LUA方式。我会尝试David建议的方法,如果不起作用,我会采用这种方法。 - Salman Syed
@EtanReisner,您能否将您的评论发布为答案?我最终采用了您的建议使用表格,并希望将您的答案标记为已接受的解决方案。 - Salman Syed
2个回答

3
尝试使用此模式:((%d)%2%2%2%2%2%2%2%2)
正如Etan在评论中提到的那样,您还可以查询表格: allowed={ ["000000000"]=true, ["111111111"]=true, ..., ["999999999"]=true } 然后,如果allowed[s]为真,则s匹配其中一个允许的模式。

2
很好地利用了捕获组,如果你碰巧得到像 "a111111111 " 这样的东西,可能需要在模式中添加 ^ 和 $。 - ryanpattison

0

如果我理解你的意思正确,你的输入将会是类似于

111111111
222222222

这意味着您可以使用以下正则表达式进行匹配:
^(\d)\1{8}$

在这里看一个例子here。基本上,我们只是捕获第一个数字并查看它是否重复了另外8次


David,感谢你提供的正则表达式,我稍后会尝试在 LUA 中使用并告诉你是否有效。 - Salman Syed
@SalmanSyed 抱歉,我无法为您提供Lua代码,因为我实际上不知道Lua。 - David says Reinstate Monica
我自己是C#的人,但试图解决这个问题。 - Salman Syed
@Etan,感谢您的更新。我考虑使用LPEG,但是在我的工具端添加库方面,我有严重的限制。顺便说一句,这正在IBM Optim中使用。 - Salman Syed
1
LPEG 不是正则表达式,但绝对可以让你在这里轻松地做你想做的事情。 - Etan Reisner
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接