2016-09-28 26 views
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: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

您的'str:gmatch'调用会在空格(空格)上拆分。就其而言,'('和')'字符没有什么特别之处;它们只是非空白字符,如'1'或'A'。这就是为什么你的代码能够完成你所看到的。我不确定是否有一种简单的方式来做你想做的事,这就是为什么我没有发布答案。有一件事要考虑:你想如何处理嵌套或不匹配的括号?例如:'“((foo))(bar)”'或'“foo)”'? (如果你想忽略这种可能性,那很可能,但任何假设都应该是明确的。) –

回答

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设置为零,并且循环正常继续。

所以,只有一个特殊情况编码为括号括起来的字符串。

这可能不是最有效的实现,但它的工作原理。此外,这假设分隔符是空格,因为当字符串连接到temp变量时,它们将与普通空间连接。这不处理嵌套括号。 这只是这个想法的一个快速演示,所以我相信如果你使用它,你可以自己修复这些缺点。

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.环绕所有spaceless子串“零标记”
(添加在开始一个二进制零字符和一个在端部)
2.卸下“零标记”从括号内取出
3.显示所有包围的部分

相关问题