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

Lua: Capturing String Based on Number of Symbols Received

我目前有一个字符串,它的大小可以是任意长度,基于 一个或两个 特定位置中的单个数字(基于捕获的第一个数字)。例如:

已更改


捕获的第一个数字告诉我是否要跟随文件名:“1”= 对象名称跟随。 “0”= 捕获的下一个输入是长度乘数。 并不总是收到“1”。但是总是收到“0”。

使用“1”捕获它看起来像这样: START|(1)|NAMEOFGRAPHIC|(0)|(#)|INPUT|INPUT|INPUT|INPUT|... etc

有“0”(没有捕获到“1”) START|(0)|(#)|INPUT|INPUT|INPUT|INPUT|... etc

长度乘数位(始终跟在“0”之后)是要跟随的输入组的数量。 "group" 是一组 4xINPUT。因此,如果它是“4”,我想要完全捕获的字符串如下所示:

带“1”: START|(1)|NAMEOFGRAPHIC|(0)|(4)|INPUT|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 时,都会在其后添加一个管道符号。我想使用管道根据数字监控输入的长度。例如,如果数字是 5,它将捕获 3x INPUT5,然后是 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` etc

直到最后收到下面的字符串:

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

此时,我的文件可以正常运行了。但直到此时,由于未完全满足函数的参数,我遇到了错误。

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

任何想法都将受到欢迎和赞赏。

干杯

预计到达时间:这些 INPUT 正在填充缓冲区。我希望该校验位负责仅在满足长度值时才使用的字符串。再一次,我真的很感谢所有的投入。谢谢。

预计到达时间:已尝试示例代码并输入更多详细信息。

Lua 中的所有字符串都是内部化的,因此将字符串推入数组通常比重复重建相同的字符串更好。此示例从标准输入中逐行获取输入。 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