2013-06-20 160 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

相关问题