2008-09-01 10 views

Odpowiedz

11

Dostaniesz to, co chcesz z YAML.

Ale z twoim ciągiem jest mały problem. YAML spodziewa się, że za przecinkiem jest miejsce. Więc musimy to

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

Kod:

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

Dziękuję bardzo za to! Miałem szaleć, próbując to rozgryźć. :) – CalebHC

+0

+1 za sprytne korzystanie z istniejącej biblioteki i wyrażenie regularne – BF4

0

Wygląda podstawowym zadaniem analizy składniowej. Generalnie podejście masz zamiar chcesz zrobić jest stworzenie funkcji rekurencyjnej z następującym ogólnym algorytmie

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 

jedynym slighlty Najtrudniejszą częścią jest tu podział wejście na jednym „”. Mógłbyś napisać osobną funkcję do tego, która skanowałaby ciąg znaków i zachowywałaby liczbę otwartych klocków - zamkniętych klocków widzianych do tej pory. Następnie podziel tylko na przecinki, gdy liczba jest równa zeru.

0

Utwórz funkcję rekursywną, która pobiera ciąg i przesunięcie całkowite, i "odczytuje" tablicę. Oznacza to, że zwraca ona tablicę lub ciąg znaków (który przeczytał) i przesunięcie całkowite wskazujące za tablicą. Na przykład:

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

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

Następnie można wywołać go z inną funkcją, która zapewnia przesunięcie 0, i zapewnia, że ​​przesunięcie jest wykończenie długość łańcucha.

3

dla śmiechu:

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

Zastrzeżenie: Na pewno nie powinien to zrobić jak eval jest straszny pomysł, ale jest szybki i ma użyteczny efekt uboczny rzuca wyjątek jeśli zagnieżdżone tablice aren 't ważny

3

Można również traktować go jako niemal JSON. Jeśli struny naprawdę są tylko litery, jak w przykładzie, to będzie działać:

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

jeżeli mogą one mieć dowolne znaki (inne niż []), to trzeba trochę więcej:

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