2013-06-20 210 views
5

我試圖通過regexp分割參數列表。Ruby正則表達式匹配逗號,但忽略括號中的逗號

這是我的參數列表的字符串:

"a = b, c = 3, d = [1,3,5,7], e, f = g" 

我要的是:

["a = b", "c = 3", "d = [1,3,5,7]", "e", "f = g"] 

我先行嘗試,但紅寶石不允許lookbehinds了動態範圍,所以這是行不通的:

/(?<!\[),(?!\w*\])/ 

如何告訴正則表達式忽略方括號中的所有內容?

+1

你保證有一個 「=」 你從輸入希望每個分割?如果你能發佈所有的約束條件,可以有更好的解決方案來做你想做的事情。 – Dogbert

+0

@Casimir,不知道爲什麼你從輸入中刪除了引號,它是一個字符串,當用雙引號括起來的時候就更清楚了。 – Dogbert

+0

@Dogbert和Casimir這就是爲什麼我把報價放在那裏。 – Kurt

回答

7

也許類似的東西會爲你工作:第二個想法後

str.scan(/(?:\[.*?\]|[^,])+/) 

編輯

在某些嵌套括號的情況下,簡單的非貪婪匹配器會失敗。

+0

這個。我喜歡這個。爲什麼我沒有想到這個? – Kurt

+1

小心點,看看我的編輯。我注意到這個解決方案對於每一種情況都是不可行的。 – samuil

+0

在這種情況下不允許嵌套的葡萄酒,所以它不應該是一個問題。非常感謝你! – Kurt

2

與其試圖用一個拆分正則表達式完成所有工作,您可以拆分,然後更正您的成對數組。

input = "a = b, c = 3, d = [1,5], e = f" 
pairs = input.split(/,\s*/) 
pairs.each_with_index do |item, index| 
    if index > 0 && (item =~ /=/).nil? 
    pairs[index - 1] += ',' + item 
    pairs[index] = nil 
    end 
end 
pairs.delete_if { |item| item.nil? } 
puts pairs 

輸出:

a = b 
c = 3 
d = [1,5] 
e = f 
+0

這是我現在的解決方案,但是我問自己,如果一步可能的話。 – Kurt

相關問題