2016-09-29 4 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

[括弧内に1つの項目がある場合の文字列の分割]可能な複製(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 
関連する問題