2013-06-20 11 views
5

Próbuję podzielić listę parametrów według wyrażeń regularnych.Wyrejestruj wyrażenie ruby, aby dopasować przecinek, ale zignoruj ​​przecinek w nawiasach

To jest łańcuch z mojej listy parametrów:

"a = b, c = 3, d = [1,3,5,7], e, f = g" 

Co chcę jest:

["a = b", "c = 3", "d = [1,3,5,7]", "e", "f = g"] 

Próbowałem z uprzedzona, ale Ruby nie pozwalają lookbehinds z zakresu dynamiki, więc to nie zadziała:

/(?<!\[),(?!\w*\])/ 

Jak mogę powiedzieć, aby wyrażenie regularne zignorowało wszystko w nawiasach kwadratowych?

+1

Czy jesteś gwarantowane mieć "=" w każdym ułamku chcesz z wejścia? Mogą istnieć lepsze rozwiązania, aby robić to, co chcesz, jeśli możesz opublikować wszystkie ograniczenia. – Dogbert

+0

@Casimir, nie wiem, dlaczego usunąłeś cytaty z danych wejściowych, jest to ciąg znaków, a to jest bardziej przejrzyste, gdy jest otoczone podwójnymi cudzysłowami. – Dogbert

+0

@Dogbert and Casimir Dlatego zamieszczam tam cytaty. – Kurt

Odpowiedz

7

Może coś takiego będzie pracować dla Ciebie:

str.scan(/(?:\[.*?\]|[^,])+/) 

EDIT po chwili namysłu.

Prosty matrydzący matcher zawiedzie w niektórych przypadkach zagnieżdżonych nawiasów.

+0

To. Lubię to. Dlaczego o tym nie pomyślałem? – Kurt

+1

Uważaj, sprawdź moją edycję. Zauważyłem, że to rozwiązanie nie jest opłacalne w każdym przypadku. – samuil

+0

Zagnieżdżone paranty nie są w tym przypadku dozwolone, więc nie powinno to stanowić problemu. Dziękuję Ci bardzo! – Kurt

2

Zamiast próbować zrobić to wszystko za pomocą jednego spacji, można podzielić, a następnie poprawić tablicę par.

input = "a = b, c = 3, d = [1,5], e = f" 
pairs = input.split(/,\s*/) 
pairs.each_with_index do |item, index| 
    if index > 0 && (item =~ /=/).nil? 
    pairs[index - 1] += ',' + item 
    pairs[index] = nil 
    end 
end 
pairs.delete_if { |item| item.nil? } 
puts pairs 

Wyjścia:

a = b 
c = 3 
d = [1,5] 
e = f 
+0

To jest moje obecne rozwiązanie, ale zadałem sobie pytanie, czy jest to możliwe w jednym kroku. – Kurt

Powiązane problemy