正则表达式拆分逗号分隔字符串

时间:2012-11-09 21:23:42

标签: ruby regex

如何按下面的字段拆分(这是sql格式)? 以前我只是用','分裂,如果该字符序列在引号内,它就会失败。 不幸的是,我也不能用引号分开,因为数字没有。

mystring = "(1, 'data, ', 'data_two, ', 'Test 34', '', 'gb', 1, '1')"
mystring.split(', ')

我需要

'1'
'data'
'data_two, '
'Test 34'
''
'gb'
'1'
'1'

3 个答案:

答案 0 :(得分:1)

如果你删除了parens,你可以使用带有选项的CSV强制它进行解析。

CSV.parse_line(mystring[1..-2], {:col_sep=>", ", :quote_char=>"'"})

 => ["1", "data, ", "data_two, ", "Test 34", "", "gb", "1", "1"]

答案 1 :(得分:0)

mystring.split(/,/).map{|x| x.gsub(/[()\']/,'').strip}
 => ["1", "data", "", "data_two", "", "Test 34", "", "gb", "1", "1"] 

答案 2 :(得分:0)

这可能会有所帮助:

irb(main):001:0> mystring
=> "(1, 'data, ', 'data_two, ', 'Test 34', '', 'gb', 1, '1')"
irb(main):002:0> mystring.scan(/(?:'(?:\\.|[^'])*'|[^,' ])+/)
=> ["(1", "'data, '", "'data_two, '", "'Test 34'", "''", "'gb'", "1", "'1')"]

或者,如果您需要删除引号和大括号,那么:

irb(main):003:0> mystring.scan(/([^', ()]+)|'([^']*)'/).flatten.compact
=> ["1", "data, ", "data_two, ", "Test 34", "", "gb", "1", "1"]

这将匹配任何非引用/括号/逗号/空格字符,或单个“引号”内的任何内容。 (注意,转义序列(\x)在第二个示例中不会与第一个示例不同。但可能您不需要这样的复杂性。)