2010-09-06 5 views
5
Capturé La répétition

C'est ce que je faisRegex - Saving Group

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

Voici ce que je reçois

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

Ce que je veux

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

aide? J'ai essayé et échoué :(

Répondre

3

C'est juste comment les groupes capture travail si vous souhaitez enregistrer toutes ces sous-chaînes, mettre le quantificateur intérieur le groupe de capture.

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

Ensuite, votre seconde capture sera :.

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

... et vous pouvez décomposer le reste de la façon dont vous

8

en général, vous ne pouvez pas obtenir un nombre arbitraire de groupes de capture, mais si vous utilisez scan vous pouvez obtenir un match de pour chaque jeton que vous voulez capturer:

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

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

Ce n'est pas trop différent de votre regex, mais j'enlevé la répétition sur la dernier jeton. \G n'est pas très connu - il indique au moteur de correspondre à la fin de la partie précédente, de sorte qu'il ne se casse pas lorsque vous avez des caractères supplémentaires entre les parties (%span :P .rockets).

Généralement, si vous avez eu plusieurs correspondances de votre expression régulière originale, cette méthode peut ajouter du travail, car les groupes ne sont pas séparés par des correspondances, mais comme match renvoie un résultat unique, cela devrait fonctionner correctement. Exemple de travail: http://ideone.com/nnmki