如何按下面的字段拆分(这是sql格式)? 以前我只是用','分裂,如果该字符序列在引号内,它就会失败。 不幸的是,我也不能用引号分开,因为数字没有。
mystring = "(1, 'data, ', 'data_two, ', 'Test 34', '', 'gb', 1, '1')"
mystring.split(', ')
我需要
'1'
'data'
'data_two, '
'Test 34'
''
'gb'
'1'
'1'
答案 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
)在第二个示例中不会与第一个示例不同。但可能您不需要这样的复杂性。)