2016-09-29 8 views
-3

공백으로 구분 된 괄호로 구분 된 문자열을 "단어"와 어떻게 일치시킬 수 있습니까? EG :루아 코드의 문제가 발생했습니다.

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

여기 내 시도입니다 : STR = "1791 (AR6K 비동기) S 2"

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) 

일반적이고 다양한 항목 수를 허용하는 또 다른 솔루션 (시도해보십시오. 단순히 루아 통역사를 거쳐야합니다) :

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