请在下面找到我的代码。
str = "1791 (AR6K Async) S 2 0 0 0 -1 2129984 0 0 0 0 0 113 0 0 20 0 1 0 2370 0 0 4294967295 0 0 0 0 0 0 0 2147483647 0 3221520956 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
for val in str:gmatch("%S+") do
print(val)
end
输出:
1791
(AR6K
Async)
S
2
0
0
0
-1
....
但我希望输出像,
1791
(AR6K Async)
S
2
0
0
0
-1
...
任何人都可以帮助我如何将括号中的值作为单个值获取,而不是获取单独的值。
答案 0 :(得分:1)
str = "1791 (AR6K Async) S 2 0 0 0 -1 2129984 0 0 0 0 0 113 0 0 20 0 1 0 2370 0 0 4294967295 0 0 0 0 0 0 0 2147483647 0 3221520956 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
for val in str:gsub("%S+","\0%0\0")
:gsub("%b()", function(s) return s:gsub("%z","") end)
:gmatch("%z(.-)%z") do
print(val)
end
说明:
1.用“零标记”围绕所有无空间子串
(在开头添加一个二进制零字符,在结尾添加一个)
2.从括号内删除“零标记”
3.显示所有被包围的部分
答案 1 :(得分:0)
可能无法单独使用单个lua模式来执行此操作。
然而,可以很容易地对字符串进行自己的解析/拆分,或者只是扩展代码以连接从以(以结尾的部分开头)的部分开始的部分
这是一个小例子
str = "1791 (AR6K Async) S 2 0 0 0 -1 2129984 0 0 0 0 0 113 0 0 20 0 1 0 2370 0 0 4294967295 0 0 0 0 0 0 0 2147483647 0 3221520956 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
local temp
for val in str:gmatch("%S+") do
if temp then
if val:sub(#val, #val) == ")" then
print(temp.." "..val)
temp = nil
else
temp = temp.." "..val
end
elseif val:sub(1,1) == "(" then
temp = val
else
print(val)
end
end
此代码的行为与您自己的行为完全相同,只是当它遇到以开始括号开头的子字符串时,它会将其保存到temp
变量。然后它会将新值连接到temp
,直到遇到在其末尾有结束括号的子字符串。此时保存到temp的整个字符串将被打印,temp被设置为nil并且循环正常继续。
所以只有一个特殊情况编码为带括号的字符串。
这可能不是最有效的实现,但它确实有效。此外,这假设分隔符是空格,因为当字符串连接到temp
变量时,它们将与普通空格连接。这不处理嵌套括号。
这只是对这个想法的快速演示,所以我相信你可以根据自己的需要自行解决这些缺点。