Pregunta

Me gustaría convertir la siguiente cadena en una matriz/matriz anidada:

str = "[[this, is],[a, nested],[array]]"

newarray = # this is what I need help with!

newarray.inspect  # => [['this','is'],['a','nested'],['array']]
¿Fue útil?

Solución

Obtendrás lo que quieres con YAML.

Pero hay un pequeño problema con tu cuerda.YAML espera que haya un espacio detrás de la coma.entonces necesitamos esto

str = "[[this, is], [a, nested], [array]]"

Código:

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"]]

Otros consejos

Para una risa:

 ary = eval("[[this, is],[a, nested],[array]]".gsub(/(\w+?)/, "'\\1'") )
 => [["this", "is"], ["a", "nested"], ["array"]]

Descargo de responsabilidad:Definitivamente no deberías hacer esto como eval Es una idea terrible, pero es rápida y tiene el efecto secundario útil de generar una excepción si sus matrices anidadas no son válidas.

También puedes tratarlo como casi JSON.Si las cadenas realmente son solo letras, como en su ejemplo, entonces esto funcionará:

JSON.parse(yourarray.gsub(/([a-z]+)/,'"\1"'))

Si pudieran tener caracteres arbitrarios (distintos de [ ], ), necesitarías un poco más:

JSON.parse("[[this, is],[a, nested],[array]]".gsub(/, /,",").gsub(/([^\[\]\,]+)/,'"\1"'))

Parece una tarea de análisis básica.Generalmente, el enfoque que querrá adoptar es crear una función recursiva con el siguiente algoritmo general

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 única parte un poco complicada aquí es dividir la entrada en un solo ','.Podría escribir una función separada para esto que escanearía la cadena y mantendría un recuento de los corchetes abiertos y cerrados vistos hasta ahora.Luego, solo divida entre comas cuando el recuento sea igual a cero.

Cree una función recursiva que tome la cadena y un desplazamiento de un número entero y "lea" una matriz.Es decir, haga que devuelva una matriz o cadena (que ha leído) y un desplazamiento entero que apunta después de la matriz.Por ejemplo:

s = "[[this, is],[a, nested],[array]]"

yourFunc(s, 1) # returns ['this', 'is'] and 11.
yourFunc(s, 2) # returns 'this' and 6.

Luego puede llamarlo con otra función que proporcione un desplazamiento de 0 y se asegure de que el desplazamiento final sea la longitud de la cadena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top