2015-08-22 2 views
3

У меня есть строка:Преобразовать строку в кортеж, хэш или массив

"(\"Doe, John\",12345)" 

Я хочу, чтобы преобразовать эту строку в кортеж ("Doe, John",12345), хэш-{"Doe, John" => 12345}, или массив ["Doe, John",12345].

Я не уверен, как разбить его на 2 элемента "Doe, John" и 12345. Я бы хотел избежать использования regex. Я не могу использовать split, потому что тогда я получаю ["(\"Doe", "John", "12345)"].

+0

Где находится хеш? Вход пользователя? Трубопроводы? – Beartech

+0

это «PG :: Result», поэтому в результате возвращается много хэшей этого типа. – jdesilvio

+1

Вы должны поразить '(« Doe, John », 12345)', поскольку это не объект Ruby. –

ответ

2
Hash[*s[1..-2].gsub('"', '').reverse.sub(',', '|').reverse.split('|')] 

Результат

{"Doe, John"=>"12345"} 

Объясните:

s         # (\"Doe, John\",12345) 
s[1..-2]       # remove bracket => \"Doe, John\",12345 
.gsub('"', '')     # remove double quote => Doe, John,12345 
.reverse.sub(',', '|').reverse # make the last , into | => Doe, John|12345 
.split('|')      # split the string to array => ["Doe, John", "12345"] 
Hash[*s]       # make the array into hash => {"Doe, John"=>"12345"} 
0

Вы должны использовать scan в тех случаях, как это, не split.

"(\"Doe, John\",12345)"[1...-1] 
.scan(/(?<=")[^"]*(?=")|[^,"]+/) 
# => ["Doe, John", "12345"] 
Смежные вопросы