Ruby正则表达式:匹配逗号,但忽略括号内的逗号

5
我将尝试通过正则表达式拆分参数列表。
这是一个包含参数列表的字符串:
"a = b, c = 3, d = [1,3,5,7], e, f = g"

我的要求是:

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

我尝试使用向前查找,但是Ruby不允许在动态范围内使用向后查找,所以这种方法行不通:

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

我该如何让正则表达式忽略方括号中的所有内容?

1
你能保证输入中每个分割都有一个 "=" 吗?如果你能发布所有的限制条件,可能会有更好的解决方案。 - Dogbert
@Casimir,不确定您为什么从输入中删除了引号,它是一个字符串,当用双引号括起来时更清晰。 - Dogbert
@Dogbert 和 Casimir,这就是我为什么要加引号的原因。 - Kurt
@Dogbert 我不能保证每个分割中都有"="。我编辑了我的问题,包括一个没有"="的分割。 - Kurt
我想强调的是,正则表达式并不是用来解析字符串的,它们更多地用于定义字符串的格式和从格式化的字符串中提取数据。解析字符串最好交给某种能够将字符串分解为标记的分词器或解析器来处理,这正是你所需要的。 - Brandon Buck
@Dogbert:你是对的,我把它们放回去了。 - Casimir et Hippolyte
2个回答

8
也许像这样的东西适合你:
 str.scan(/(?:\[.*?\]|[^,])+/)

编辑 经过二次思考。

简单的非贪婪匹配器在一些嵌套括号的情况下会失败。


这个。我喜欢这个。为什么我没想到这个? - Kurt
1
小心点,看看我的修改。我注意到这个解决方案并不适用于每种情况。 - samuil
在这种情况下,不允许嵌套括号,所以这不应该是一个问题。非常感谢! - Kurt
你也可以使用 str.scan /[^,]*\[.*?\]|[^,]+/ - Yuri Golobokov
我想在 {} 中的 , 也被忽略。这是正则表达式 (?:(\[|\{).*?(\]|\})|[^,])+,这样可以吗? - Rolly

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

这是我的目前解决方案,但我在问自己是否可能一步完成。 - Kurt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接