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 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` 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
我目前有一个字符串,它的大小可以是任意长度,基于 一个或两个 特定位置中的单个数字(基于捕获的第一个数字)。例如:
已更改
捕获的第一个数字告诉我是否要跟随文件名:“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 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` 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