2014-05-05 5 views
1

J'essaie de capturer tous les blocs {% tag %}...{% endtag %} individuellement dans une chaîne, mais mon expression régulière retourne toujours la chaîne entière de la première étiquette d'ouverture à la dernière étiquette de fin. Comment puis-je faire en sorte qu'il capture tous les blocs séparément au lieu d'un seul match?Regex: capturer plusieurs blocs similaires

Voici un exemple d'une chaîne:

{% tag %}Lorem ipsum dolor sit amet{% endtag %} 

{% tag %} 
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 
{% endtag %} 

Et mon regex (en rubis): /(\{% trans %\}.*\{% endtrans %\})/m

Je sais que le .* est le problème, mais je n'ai pas trouvé un moyen de correspondre à tout sauf une étiquette de fermeture.

Répondre

3

Vous devez utiliser un quantificateur non gourmand ou paresseux (?). Cela signifie que .*? essaiera de correspondre le moins possible au lieu du .* correspondant autant que possible (gourmand).

/(\{% trans %\}.*?\{% endtrans %\})/m 

DEMO

+0

Je ne savais pas que vous pouvez combiner '' * avec '?'. Fonctionne parfaitement merci! – romainberger

+0

@romainberger, pas de problème. Heureux d'avoir pu aider. – sshashank124

Questions connexes