2010-09-06 13 views
5

Questo è quello che sto facendoRegex - Risparmio Ripetendo Catturato Gruppo

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

Questo è ciò che ottengo

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

Questo è quello che voglio

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

aiuto? Ho provato e fallito :(

risposta

3

questo è solo come gruppi di cattura funzionano Se si desidera salvare tutte quelle stringhe, mettere il quantificatore all'interno il gruppo di acquisizione:.

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

Poi il secondo di cattura sarà :.

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

... e si può abbattere il resto del modo in cui te

8

in generale, non si può ottenere un numero arbitrario di gruppi di cattura, ma se si utilizza scan si può ottenere un partita per ogni pedina che si desidera acquisire:

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

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

Questo non è troppo diverso dal vostro regex, ma ho rimosso ripetizione sulla ultimo token. \G non è troppo noto - indica al motore di corrispondere dove è finita la partita precedente, quindi non si interrompe quando si hanno caratteri aggiuntivi tra le partite (%span :P .rockets).

Generalmente, se avessi più corrispondenze della tua espressione regolare, questo metodo potrebbe aggiungere un po 'di lavoro, perché non hai i gruppi separati per le partite, ma dal momento che match restituisce un singolo risultato dovrebbe funzionare correttamente.

Esempio di lavoro: http://ideone.com/nnmki