2010-09-06 10 views
5

To co robięRegex - Zapisywanie powtarzając Schwytany Grupa

a = "%span.rockets#diamonds.ribbons.forever" 
a = a.match(/(^\%\w+)([\.|\#]\w+)+/) 
puts a.inspect 

To co mam

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".forever"> 

To jest to, co chcę

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".rockets" 3:".#diamonds" 4:".ribbons" 5:".forever"> 

pomocy? Próbowałem i nie udało :(

Odpowiedz

3

To tylko jak grupy przechwytywania pracy, jeśli chcesz zapisać wszystkie te podciągi, umieścić kwantyfikator wewnątrz grupę przechwytywania.

a = a.match(/(^%\w+)((?:[.#]\w+)+)/) 

Wtedy twój drugi przechwytywania będzie :.

2:".rockets#diamonds.ribbons.forever" 

... i można go rozkładać na resztę drogi samemu

8

Generalnie, nie można dostać dowolna liczba grup przechwytywania, ale jeśli używasz scan można uzyskać mecz za każdy żeton chcesz uchwycić:

a = "%span.rockets#diamonds.ribbons.forever" 
a = a.scan(/^%\w+|\G[.|#]\w+/) 
puts a.inspect 

["%span", ".rockets", "#diamonds", ".ribbons", ".forever"] 

To nie jest zbyt różni się od wyrażenia regularnego, ale usunąłem powtórzenia na ostatni token. \G nie jest zbyt dobrze znany - informuje silnik, aby pasował do miejsca poprzedniego meczu, więc nie pęka, gdy masz dodatkowe postacie pomiędzy meczami (%span :P .rockets).

Ogólnie rzecz biorąc, jeśli masz kilka dopasowań oryginalnego wyrażenia regularnego, ta metoda może dodać trochę pracy, ponieważ nie masz grup rozdzielonych na mecze, ale ponieważ match zwraca pojedynczy wynik, powinien działać poprawnie.

Przykład roboczy: http://ideone.com/nnmki

Powiązane problemy