Lua:根据接收到的符号数量捕获字符串

我目前有一个字符串,它可以根据第一个数字在一个或两个特定位置(基于捕获的第一个数字)的大小而具有任何长度。例如:

更改


第一个数字捕获告诉我是否需要跟随文件名:“1”=对象名称跟随。“0”=接下来捕获的是长度倍增器。“1”不总是接收到的。但是,“0”总是接收到的。

使用“1”捕获的情况下如下: START|(1)|NAMEOFGRAPHIC|(0)|(#)|INPUT|INPUT|INPUT|INPUT|... etc

使用“0”(没有捕获到“1”) START |(0)|(#)|INPUT|INPUT|INPUT|INPUT|……等等

“长度倍增器”位(总是跟随“0”)是要跟随的INPUT组数。 “组”是4x INPUT的一组。因此,如果是“4”,我要完全捕获的字符串如下所示:

使用“1”: START|(1)|NAMEOFGRAPHIC|(0)|(4)|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|

使用“0”: START |(0)|(4)|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|INPUT|


每次接收INPUT时,都会在其后添加一个管道符号。我想使用管道来监视输入的长度,以基于数字捕获3x INPUT,例如如果数字为5,那么之后会捕获5x INPUT(包括所有管道)。完成此操作后,该函数将将完全捕获的字符串发送给其他函数以供使用。

我在努力解决收到该完整字符串的接收函数方面出现了问题。我尝试在不同的循环函数中计算管道数,但所有函数都会产生错误。

尝试包括(请理解我对所有这些都很新):

local buffer = ""
function pipe_count(input)
    a = "|"
    buffer = buffer..input.."|"
    while #a < 5 do
        buffer = buffer..input.."|"
        return buffer
    end
end

local buffer = ""
function pipe_count(input)
    buffer = buffer..input.."|"
    mult = tonumber(buffer:match("(.-|.-|.-|(%d)|.*)"))
    while buffer do
        for i = 1, mult do
            buffer = buffer..input.."|"
        end
    return buffer
end

这是我尝试的两个示例。我删除了其他徒劳的尝试来捕获确切的字符串长度。我的当前问题是,它正在将INPUT捕获,并在捕获整个字符串之前发送到下一个函数。因此,如果我接收了顶部的字符串,它将如下所示:

`INPUT`
`INPUT|INPUT`
`INPUT|INPUT|INPUT`
`INPUT|INPUT|INPUT|5`
`INPUT|INPUT|INPUT|5|INPUT`
`INPUT|INPUT|INPUT|5|INPUT|INPUT`等等

直到最终接收到以下字符串:

`INPUT|INPUT|INPUT|5|INPUT|INPUT|INPUT|INPUT|INPUT|`

此时,我的文件运行正常。但是在此之前,由于函数的参数没有完全满足,我会出现错误。

理想情况下,我希望在继续之前获得最后一个字符串。

如有任何想法,将不胜感激。谢谢。

ETA:这些INPUT正在填充缓冲区。我希望检查数字负责仅在长度值满足时使用字符串。再次感谢所有输入。谢谢。

ETA:尝试过的示例代码和更多详细信息。

点赞
用户4402825
用户4402825

Lua 中的所有字符串都是内部化的,因此通常最好将字符串推送到数组中,而不是反复重新构建相同的字符串。此示例从 stdin 逐行输入。3 个数据输入,紧随其后的是一个数字,后跟该数字的数据输入。有很多其他的方法来完成这个任务,但这个方法很容易跟随。

local buffer = {}
function process_input(input)
    if #buffer == 3 then
        input = tonumber(input)
    end

    table.insert(buffer,input)

    if #buffer > 4 and #buffer == buffer[4] + 4 then
       local pipe_delim = table.concat(buffer,'|')
       buffer = {}
       return pipe_delim
    end
end

repeat
    local input = io.read()

    local pipe_delim = process_input( input )
    if pipe_delim then
       print('Got:', pipe_delim)
    end
until false
2015-02-11 21:08:22