2012-11-09 285 views
1

如何拆分下面的字段(這是sql格式)? 以前我用的只是用''分割,如果那個字符序列在引號內,它會失敗的問題。 不幸的是,我也不能通過引號分割,因爲數字沒有。正則表達式分割逗號分隔字符串

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

我需要得到

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

我的不好修復忘記了引號 – user391986

+0

查看下面的答案.. 。請批准這是否適用於您 – Tilo

+4

爲什麼不使用[CSV](http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html),因爲它的設計處理這樣的字符串? –

回答

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

因爲在引號之間可能會有一個逗號,就像第二個項目 – user391986

1

,如果你帶了括號,你可以強制其被解析的使用CSV的選項。

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

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

@theTinMan中的那樣,我認爲這是你的前進方向...... –

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)在第二個例子中不算第一個例子,但可能是您不需要這種併發症。)

相關問題