在Ruby内的内容:正则表达式来解析以逗号分隔的列表中排除括号
已知以下字符串:
str = 'foo,baz(some,other,stuff),hello,goodbye'
我想分析字符串使得与括号出现的逗号不被视为分隔符。所以,以下字段将被捕获给出这个例子:
- 富
- 巴兹(一些,其他的东西)
- 你好
- 再见
帮助非常感谢!
在Ruby内的内容:正则表达式来解析以逗号分隔的列表中排除括号
已知以下字符串:
str = 'foo,baz(some,other,stuff),hello,goodbye'
我想分析字符串使得与括号出现的逗号不被视为分隔符。所以,以下字段将被捕获给出这个例子:
帮助非常感谢!
这似乎工作在它匹配的模式。但是,我很难定义捕获组,以便可以捕获这些字段(正如我原来的帖子中提到的那样) – bjlevine
这里有一个非正则表达式的解决方案,利用了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"]
请注意,使用正则表达式处理_nested_括号是不可能的(以严格的数学意义!)。 http://stackoverflow.com/a/133684/239816 –
@PaulCantrell:通常所说的“正则表达式”或“正则表达式”与计算机科学中所谓的“正则表达式”有所不同,这种工具没有这种限制(特别是在红宝石中)。 –
@CasimiretHippolyte:你说得对:由于提问者确实指定了Ruby,我一开始并没有注意到,他们可以使用'\ g'扩展名。 –