Lua模式匹配-强制可选参数在继续前填充?

我需要一个可以抓取两个或多个变长参数值的 pattern。

我需要将 scanf 格式 %i 转换成 Lua pattern,但这证明是非常困难的。我不需要担心可以使用 scanf 传递的存储类型,只需要关注整数型的 %i 以及是否指定了具体链接。

如果需要 scanf 的文档,请参阅此处

这是我目前为止的代码:

if(scanfLetter == "i" or scanfLetter == "d" or scanfLetter == "u") then
   if(specifiedNum == 0)then
     newPattern = "([%+%-]?%d+)"
   elseif(specifiedNum >= 2)then
     newPattern = "([%+%-%d]?%d^".. string.rep("%d?", specifiedNum-2)..")$"
   else
     newPattern = "(%d)"
   end

它基本上只是检查是否传入了指定的数字 (specifiedNum)。如果这个数字是 0,那么表示没有指定。

当连续出现两个指定长度的 %i 时,问题就来了。例如:

%5i%6i

如果他们输入了 6 个或更多字符,它就可以正常工作,因为 match 将返回两个值:第一个包含前五个数字,第六个进入下一个值。问题在于如果少于 5 个数字。在 scanfprintf 中,如果数字小于或等于 5,它将无法匹配%5i%6i,但在我的 pattern 中,它仍会在 string.match 中匹配,并返回所有的值,但是最后一个在第一个返回中,而第二个值包含输入的最后一个数字。

更具体的示例,所以您无需输入所有内容并查看 pattern 最终是什么:

假设:

([%.%+%-%d]?%d[%.%d]?[%.%d]?[%.%d]?)([%.%+%-%d]?%d[%.%d]?[%.%d]?[%.%d]?[%.%d]?)

如果将 123456789 传递给它,match 将返回 2 个值:

`12345` 和 `6789`

但是,如果输入 1234,则 match 将返回 2 个值:

`123` 和 `4`

这是不正确的(它不应是一个匹配)。

我需要的东西有可能吗?

(也许已经有人编写了 scanf 格式转换为 Lua pattern 的转换器?)

点赞