Comment puis-je convertir un Rubis chaîne avec des crochets pour un tableau?

StackOverflow https://stackoverflow.com/questions/38409

  •  09-06-2019
  •  | 
  •  

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']]
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top