Просто из любопытства:
▶ str = "id,name,user[id,email]"
▶ eval "[#{str.gsub(/(\w+)\[(.*?)\]/, '{\1=>[\2]}').gsub(/\w+/, ':\0')}]"
#⇒ [
# [0] :id,
# [1] :name,
# [2] {
# :user => [
# [0] :id,
# [1] :email
# ]
# }
#]
Юридическая информация: использовать eval
в производстве следует понимать риски.
UPD Safe eval
Инг (обратите внимание, что каждый ASCII \w
символ преобразуется в это широкая пара из UTF-8, чтобы предотвратить инъекции, а не лучший способ вокруг, но это работает хорошо, если у вас есть рубин функции, названные с широкими символами):
▶ safe = str.gsub(/\w/) do |e|
▷ e.each_codepoint.map do |cp|
▷ cp + 0xFF00 - 0x0020
▷ end.pack('U')
▷ end
#⇒ "id,name,user[id,email]"
▶ eval "[#{safe.gsub(/(\p{L}+)\[(.*?)\]/, '{\1=>[\2]}').gsub(/\p{L}+/, ':\0')}]"
#⇒ [
# [0] :id,
# [1] :name,
# [2] {
# :user => [
# [0] :id,
# [1] :email
# ]
# }
#]
Теперь вы можете повернуть ключи с широких символов на ASCII.
Ваш ожидаемый массив недействителен. – sawa
Каков контекст? Я думаю, что если вы предоставите немного больше информации о том, что вы пытаетесь сделать, это может помочь. –
@sawa Отредактировано это, чтобы быть более подходящим. Ruby преобразует '[" id "," name "," user "=> [" id "," email "]]' to '[" id "," name ", {" user "=> [" id "," "электронная почта"]}] '. В этом примере пользователь стал хэшем внутри массива. Вы можете попробовать его ввести мой оригинальный массив в консоли. –