Frage

Ich möchte den folgenden String in ein Array/verschachteltes Array umwandeln:

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

newarray = # this is what I need help with!

newarray.inspect  # => [['this','is'],['a','nested'],['array']]
War es hilfreich?

Lösung

Mit YAML bekommen Sie, was Sie wollen.

Aber es gibt ein kleines Problem mit Ihrer Saite.YAML erwartet, dass sich hinter dem Komma ein Leerzeichen befindet.Also brauchen wir das

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

Andere Tipps

Zum Lachen:

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

Haftungsausschluss:Das sollten Sie auf keinen Fall tun eval ist eine schreckliche Idee, aber sie ist schnell und hat den nützlichen Nebeneffekt, dass sie eine Ausnahme auslöst, wenn Ihre verschachtelten Arrays nicht gültig sind

Sie können es auch als Beinahe-JSON behandeln.Wenn die Zeichenfolgen wirklich nur aus Buchstaben bestehen, wie in Ihrem Beispiel, funktioniert Folgendes:

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

Wenn sie beliebige Zeichen haben könnten (außer [ ] , ), bräuchten Sie etwas mehr:

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

Sieht aus wie eine einfache Parsing-Aufgabe.Im Allgemeinen besteht der Ansatz, den Sie wählen möchten, darin, eine rekursive Funktion mit dem folgenden allgemeinen Algorithmus zu erstellen

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

Der einzige etwas knifflige Teil hier ist die Aufteilung der Eingabe auf ein einzelnes „,“.Sie könnten hierfür eine separate Funktion schreiben, die den String durchsucht und die bisher gesehenen offenen Klammern und geschlossenen Klammern zählt.Dann nur dann durch Kommas aufteilen, wenn die Anzahl gleich Null ist.

Erstellen Sie eine rekursive Funktion, die die Zeichenfolge und einen ganzzahligen Offset verwendet und ein Array „ausliest“.Das heißt, es soll ein Array oder einen String (den es gelesen hat) und einen ganzzahligen Offset zurückgeben, der nach dem Array zeigt.Zum Beispiel:

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

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

Dann können Sie es mit einer anderen Funktion aufrufen, die einen Offset von 0 bereitstellt und sicherstellt, dass der Endoffset der Länge der Zeichenfolge entspricht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top