Comment puis-je convertir un Rubis chaîne avec des crochets pour un tableau?
Question
Je voudrais le convertir la chaîne de caractères dans un tableau/tableau imbriqué:
str = "[[this, is],[a, nested],[array]]"
newarray = # this is what I need help with!
newarray.inspect # => [['this','is'],['a','nested'],['array']]
La solution
Vous allez obtenir ce que vous voulez avec YAML.
Mais il y a un petit problème avec votre chaîne.YAML s'attend à ce qu'il y a un espace derrière la virgule.Nous avons donc besoin de cette
str = "[[this, is], [a, nested], [array]]"
Code:
require 'yaml'
str = "[[this, is],[a, nested],[array]]"
### transform your string in a valid YAML-String
str.gsub!(/(\,)(\S)/, "\\1 \\2")
YAML::load(str)
# => [["this", "is"], ["a", "nested"], ["array"]]
Autres conseils
Pour rire un peu:
ary = eval("[[this, is],[a, nested],[array]]".gsub(/(\w+?)/, "'\\1'") )
=> [["this", "is"], ["a", "nested"], ["array"]]
Avertissement:Vous ne devriez pas faire ce que eval
est une idée terrible, mais il est rapide et a l'effet secondaire utile de lancer une exception si vos tableaux imbriqués ne sont pas valides
Vous pouvez également traiter comme la quasi-JSON.Si les cordes sont vraiment que des lettres, comme dans votre exemple, alors cela va fonctionner:
JSON.parse(yourarray.gsub(/([a-z]+)/,'"\1"'))
S'ils peuvent avoir des caractères arbitraires (autres que [ ] , ), vous auriez besoin d'un peu plus:
JSON.parse("[[this, is],[a, nested],[array]]".gsub(/, /,",").gsub(/([^\[\]\,]+)/,'"\1"'))
Ressemble à une base d'analyse de la tâche.Généralement, l'approche que vous allez vouloir faire est de créer une fonction récursive avec la suite de l'algorithme général
base case (input doesn't begin with '[') return the input
recursive case:
split the input on ',' (you will need to find commas only at this level)
for each sub string call this method again with the sub string
return array containing the results from this recursive method
La seule slighlty partie difficile ici est de fractionnement de l'entrée sur une seule ','.Vous pouvez écrire une fonction distincte pour ce qui serait de numériser à travers la chaîne et de tenir un compte de la openbrackets - closedbrakets vu jusqu'à présent.Alors qu'à découper sur des virgules lorsque le nombre est égal à zéro.
Faire une fonction récursive qui prend la chaîne de caractères et un entier décalage, et "lit" d'un tableau.C'est, d'y faire retourner un tableau ou une chaîne (qu'il a lu) et un entier décalage de pointage après le tableau.Par exemple:
s = "[[this, is],[a, nested],[array]]"
yourFunc(s, 1) # returns ['this', 'is'] and 11.
yourFunc(s, 2) # returns 'this' and 6.
Ensuite, vous pouvez l'appeler avec une autre fonction qui fournit un offset de 0, et permet de s'assurer que la finition de décalage est la longueur de la chaîne.