2010-09-06 9 views
5

Das ist, was ichRegex - Speichern Gruppe Captured Wiederholen von

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

tun Dies ist, was ich

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

bekommen Dies ist, was ich will

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

Hilfe? Ich habe versucht und sind gescheitert :(

Antwort

3

dass gerade ist, wie die Erfassung Gruppen arbeiten Wenn Sie alle diese Teil speichern möchten, legen Sie die quantifier innen die Erfassungsgruppe.

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

Dann wird Ihr zweiter Fang wird :.

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

... und Sie können es brechen sich den Rest des Weges nach unten

8

im Allgemeinen können Sie nicht bekommen eine beliebige Anzahl von zwischengespeicherten Gruppen, aber wenn Sie scan verwenden können Sie eine Spiel bekommen für jedes Token Sie erfassen möchten:

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

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

Diese von Ihrem regex nicht zu unterschiedlich ist, aber ich entfernt Wiederholung auf der letztes Token \G ist nicht allzu bekannt - es teilt der Engine mit, wo das vorherige Spiel endete, also bricht es nicht ab, wenn Sie zwischen den Spielen zusätzliche Zeichen haben (%span :P .rockets).

Im Allgemeinen, wenn Sie mehrere Übereinstimmungen Ihrer ursprünglichen Regex hatte, kann diese Methode einige Arbeit hinzufügen, weil Sie die Gruppen nicht zu Übereinstimmungen getrennt haben, aber da match ein einzelnes Ergebnis zurückgibt, sollte es gut funktionieren.

Arbeitsbeispiel: http://ideone.com/nnmki