2013-07-27 39 views
0

解析的String(不帶空格):解析字符串以嵌套的括號

"instrumentalist ( bass (upright , fretless , 5-string) , guitar (electric , acoustic) , trumpet ), teacher , songwriter, producer" 

我需要在Ruby中

["instrumentalist",[["bass",["upright","fretless","5-string"]],["guitar",["electric","acoustic"]],["trumpet"]],["teacher"],["songwriter"],["producer"]] 

因爲得到這個結構嵌套(),String#partition不能幫我。我真的不知道是否有一種可以提取此類字符串的花式RegEx。或者我必須和一個詞法分析器一起使用?

+0

你的問題非常含糊。你需要更具體地瞭解你想要完成的事情。 「提取」和「這種類型的字符串」是什麼意思?你想嘗試替換嗎?如果是這樣,你想用什麼取代什麼?你想匹配字符串的特定部分嗎?如果是這樣,你想要匹配什麼。儘可能清楚標準是什麼以及你想完成什麼。 –

+1

「5串」從哪裏來?此外,這似乎你需要一個實際的解析器。 – squiguy

+0

看起來你可以用字符串掃描器做到這一點 –

回答

4

雖然基本過程很簡單,但對於這類問題,正則表達式本身並不是正確的排序方式:遍歷字符串查找逗號或括號。當您找到逗號時,將以前的讀取字符添加到當前嵌套。當你找到一個開放的支架,然後你的嵌套級別上升1,當你發現一個左括號減少它。

StringScanner是爲這類東西而設計的,因爲它允許我們在保持一些狀態的同時穿過字符串,在這種情況下,這是一個反映開啓和關閉括號的堆棧。類似這樣的工作對我來說是不對的

require 'strscan' 

def parse input 
    scanner = StringScanner.new input 
    stack = [[]] 
    while string = scanner.scan(/[^(),]+/) 
    case scanner.scan /[(),]+/ 
    when '(' 
     new_nesting = [string, []] 
     stack.last << new_nesting 
     stack << new_nesting[1] 
    when ')' 
     scanner.scan(/,/) 
     stack.last << string 
     stack.pop 
    else 
     stack.last << string 
    end 
    end 
    stack.last 
end 
+0

這不是一個問題的答案:[我]必須和[a]詞法分析器一起去? – sawa

+0

給出了答案:'[「豎立」,「無品」]'對於字符串'低音(直立,無品)' – bsd

+0

啊,是的,沒有妥善處理這種情況。 –

相關問題