2016-09-29 101 views
-3

如何匹配「words」混合括號分隔的字符串,因爲它們之間用空格分隔。 EG:在lua代碼中遇到問題

split_words_and_parenthesis("1791 (AR6K Async) S 2 ") --> {"1791","AR6K Async","S","2"} 

這裏是我的嘗試: 海峽= 「1791(AR6K異步)S2」

for val in str:gmatch("%S+") do 
    if str:gmatch("(")then 
    str:gsub("%b()" , function(s) val=s end) 
    print(val) 
    else 
    print(val) 
    end 
end 

output: 

(AR6K Async)     
(AR6K Async)    
(AR6K Async)    
(AR6K Async)  
(AR6K Async) 
+5

可能重複[分割一個項目在括號中的字符串](http://stackoverflow.com/questions/39755445/splitting-a-string-where-one-item-is-in-parentheses) –

+1

嘗試改善你現有的問題,而不是打開一個關於同一問題的新問題。 – Piglet

+0

你已經問過這個... – warspyking

回答

0

可以用string.match如果你知道的格式來解決:

str = "1791 (AR6K Async) S 2 " 

s1 = str:match("(%d%d%d%d)%s%(.*%)%s.+%s.+") 
s2 = str:match("%d%d%d%d%s(%(.*%))%s.+%s.+") 
s3 = str:match("%d%d%d%d%s%(.*%)%s(.+)%s.+") 
s4 = str:match("%d%d%d%d%s%(.*%)%s.+%s(.+)") 

print(s1) 
print(s2) 
print(s3) 
print(s4) 

另一個通用的解決方案,允許可變數量的條目(嘗試它:簡單地過去在lua解釋器中):

function get_separate_words(str) 
    local i = 1 
    local words = {} 

    function get_parentheses_content(str,is_recursively_called) 
     local i = 1 
     local function split(s, sep) 
      local fields = {} 

      local sep = sep or ":" 
      local pattern = string.format("([^%s]+)", sep) 
      string.gsub(s, pattern, function(c) fields[#fields + 1] = c end) 

      return fields 
     end 

     for j = 1,#str do 
      local c = string.sub(str,j,j) 
      local d = string.sub(str,j+1,j+1) 
      if j <= i then 
      elseif c == "(" then 
       i = j + #get_parentheses_content(string.sub(str,j+1,#str),true) + 2 
      elseif c == ")" and (is_recursively_called or (d == " ") or (not d)) then 
      print('c') 
       local parentheses_content = string.sub(str,1,j-1) 
       return {parentheses_content} 
      end 
     end 
     local parentheses_content = string.match(str,"^(.*)%)%s+[^)]*$") 
     if parentheses_content then print('a') end 
     parentheses_content = parentheses_content or string.match(str,"^(.*)%)$") 
     if parentheses_content then 
     print("A") 
      return {parentheses_content} 
     else 
     print("B") 
      return split("("..str," ") 
     end 
    end 

    local function merge(table_a, table_b) 
     table_a = table_a or {} 
     table_b = table_b or {} 

     for k_b, v_b in pairs(table_b) do 
      if type(v_b) == "table" and type(table_a[k_b] or false) == "table" then 
       merge(table_a[k_b], table_b[k_b]) 
      else 
       table_a[k_b] = v_b 
      end 
     end 

     return table_a 
    end 

    for j = 1,#str do 
     local c = string.sub(str,j,j) 
     if j < i then 
     elseif c == " " or j == #str then 
      local word = string.gsub(string.sub(str,i,j)," ","") 
      if #word > 0 then 
       table.insert(words, word) 
       print(word) 
      end 
      i = j+1 
     elseif c == "(" then 
      local all_characters_after_opening_parentheses = string.sub(str,j+1,#str) 
      local parentheses_content = get_parentheses_content(all_characters_after_opening_parentheses)[1] 
      table.insert(words, parentheses_content) 
      j= j+#parentheses_content+2 
      i = j 
     end 
    end 
    return words 
end 

separate_words = get_separate_words("1791 (AR6(K As)ync) S 2)") 

for k,v in ipairs(separate_words) do print(k,v) end