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