拆分一个项目在括号中的字符串

时间:2016-09-28 18:48:42

标签: 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"

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
...

任何人都可以帮助我如何将括号中的值作为单个值获取,而不是获取单独的值。

2 个答案:

答案 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变量时,它们将与普通空格连接。这不处理嵌套括号。 这只是对这个想法的快速演示,所以我相信你可以根据自己的需要自行解决这些缺点。