ruby - чтение строки в массив / подмассив - PullRequest
1 голос
/ 13 марта 2012

Я ищу хороший способ конвертировать строки как:

"[apples, oranges, [strawberries, peas, grapes]]"

в массив, который будет выглядеть так:

array = [apples, oranges, [strawberries, peas, grapes]].

следовательно array[0] = ["apples"], array[1] = ["oranges"] и array[2] = ["strawberries", "peas", "grapes"]

Таким образом, всякий раз, когда в моей строке есть другие внутренние квадратные скобки, содержимое в скобках будет подрешеткой моего базового массива.

Ответы [ 3 ]

1 голос
/ 14 марта 2012

Хм, если бы ваши строки были окружены "", это было бы проще, чем вы могли бы просто использовать JSON-анализатор ;-). Но для этого вам придется написать свой собственный парсер. Для ruby ​​существуют разные гемы генератора парсеров. Например.

Парслет: http://kschiess.github.com/parslet/

Верх дерева: http://treetop.rubyforge.org/

1 голос
/ 14 марта 2012
eval s.gsub /\w+/, '"\&"'

или, для альтернативного результата, который может быть полезен ...

eval s.gsub /\w+/, ':\&'

Теперь они уязвимы для эксплойтов внедрения кода , если у вас нет полного контроляввода, так что вы можете установить JSON gem и сделать что-то вроде этого:

require 'json'

JSON.parse s.gsub /\w+/, '"\&"'
1 голос
/ 14 марта 2012

Вы можете использовать gsub, чтобы заключить слова в кавычки, а затем eval строку:

eval str.gsub(/\w+/) { |match| "'#{match}'" }

Это предполагает, что ваши слова - это слова в смысле регулярного выражения: буквенно-цифровой. Кроме того, это быстро и грязно, и я не рекомендую использовать eval, если этого можно избежать (например, с помощью ввода на языке синтаксического анализа), поскольку это может быть угрозой безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...