2015-10-28 15 views
1

在Ruby内的内容:正则表达式来解析以逗号分隔的列表中排除括号

已知以下字符串:

str = 'foo,baz(some,other,stuff),hello,goodbye' 

我想分析字符串使得与括号出现的逗号不被视为分隔符。所以,以下字段将被捕获给出这个例子:

  1. 巴兹(一些,其他的东西)
  2. 你好
  3. 再见

帮助非常感谢!

+0

请注意,使用正则表达式处理_nested_括号是不可能的(以严格的数学意义!)。 http://stackoverflow.com/a/133684/239816 –

+0

@PaulCantrell:通常所说的“正则表达式”或“正则表达式”与计算机科学中所谓的“正则表达式”有所不同,这种工具没有这种限制(特别是在红宝石中)。 –

+0

@CasimiretHippolyte:你说得对:由于提问者确实指定了Ruby,我一开始并没有注意到,他们可以使用'\ g'扩展名。 –

回答

1

使用正则表达式

[^,(]*(?:\([^)]*\))*[^,]* 

Regex explanation here

Regular expression visualization

+0

这似乎工作在它匹配的模式。但是,我很难定义捕获组,以便可以捕获这些字段(正如我原来的帖子中提到的那样) – bjlevine

1

这里有一个非正则表达式的解决方案,利用了Ruby的很少使用flip-flop operator

str = "foo,baz(some,other,stuff),hello,goodbye" 

str.split(',').chunk { |s| s.include?('(') .. s.include?(')') ? true : false }. 
       flat_map { |tf, a| tf ? a.join(' ') : a } 
    #=> ["foo", "baz(some", "other", "stuff)", "hello", "goodbye"] 

步骤:

arr = str.split(',') 
    #=> ["foo", "baz(some", "other", "stuff)", "hello", "goodbye"] 

enum = arr.chunk { |s| s.include?('(') .. s.include?(')') ? true : false } 
    #=> #<Enumerator: #<Enumerator::Generator:0x007fdf9d01d2e8>:each> 

另外:flip-flop操作者必须是if语句中,所以这不能被简化为:

enum = arr.chunk { |s| s.include?('(') .. s.include?(')') } 

我们可以将此枚举转换成数组,以查看值它会传递给Enumerable#flat_map

enum.to_a 
    #=> [[false, ["foo"]], [true, ["baz(some", "other", "stuff)"]], 
    # [false, ["hello", "goodbye"]]] 

最后:

enum.flat_map { |tf, a| tf ? a.join(' ') : a } 
    #=> ["foo", "baz(some", "other", "stuff)", "hello", "goodbye"] 
相关问题