2015-10-27 10 views
5

Biorąc pod uwagę ciąg tablicy w Ruby z niektórych elementów w cudzysłowie, które zawierają przecinki:Podziel ciąg na tablicę przecinkiem, chyba że przecinek jest wewnątrz cytuje

my_string.inspect 
# => "\"hey, you\", 21" 

Jak mogę uzyskać tablicę:

["hey, you", " 21"] 
+7

Prawdopodobnie lepiej użyć istniejącego klejnotu CSV. "Jak" jest napisanie parsera CSV, co jest bardziej denerwujące, niż można by się spodziewać. –

+1

@DaveNewton dziękuję! Zajrzałem do biblioteki Ruby CSV i "string" .parse_csv daje mi to, czego szukam. – steel

Odpowiedz

5

Standardowa biblioteka w wersji CSV z biblioteką CSV .parse_csv wykonuje dokładnie to.

require 'csv' 
"\"hey, you\", 21".parse_csv 
# => ["hey, you", " 21"] 
+0

Z tego co widzę, [String # parse_csv] (http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/String.html) został zamortyzowany (od wersji 1.9.2), w w takim przypadku powinieneś użyć [CSV :: parse_line] (http://ruby-doc.org/stdlib-2.0.0/libdoc/csv/rdoc/CSV.html#method-c-parse_line) (tj. 'require ' csv '; CSV.parse_line ("\" hej, ty \ ", 21)'). Czy wiesz, czy tak właśnie jest? –

+0

@CarySwoveland wygląda na to, że String #parse_csv wciąż żyje i kopie od Ruby 2.2. 3. http://www.rubydoc.info/stdlib/csv/String%3Aparse_csv i http://ruby-doc.org/stdlib-2.2.3/libdoc/csv/rdoc/CSV.html – steel

1

Tak, używając CSV::parse_line jest do zrobienia tutaj, ale można też zrobić to z regex:

r =/
    (?:  # Begin non-capture group 
    (?<=\") # Match a double-quote in a positive lookbehined 
    .+?  # Match one or more characters lazily 
    (?=\") # Match a double quote in a positive lookahead. 
    )  # End non-capture group 
    |  # Or 
    \s\d+ # Match a whitespace character followed by one or more digits 
    /x  # Extended mode 

str = "\"hey, you\", 21" 
str.scan(r) 
    #=> ["hey, you", " 21"] 

Jeśli wolisz mieć "21" zamiast " 21", po prostu usunąć \s .