把一个带有括号的字符串分割开

请查看以下代码。

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

请问有人能帮我获取括号中的值作为单个值,而不是获取单独的值吗?

点赞
用户3586583
用户3586583

可能无法使用单一的 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 变量时,它们将与普通空格连接在一起。它不能处理嵌套的括号。

然而,这只是一个快速展示这个想法的示例,我认为如果你要使用它,你可以根据需要自行解决这些缺点。

2016-09-28 21:18:54
用户6834680
用户6834680
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"

-- 将所有没有空格的子串使用 "零标记" 包围起来
-- 在开头和结尾添加一个二进制零字符
-- \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
2016-09-29 07:43:09