2010-07-28 7 views
0

J'essaie de trouver le texte qui contient un < ou> entre {}. Ceci est dans HTML et j'ai du mal à le rendre "insensible".Expression régulière, faire correspondre les caractères entre {}

Je veux trouver du texte qui correspond à ces chaînes:

{test > 3} 
{testing >= 3 : comment} 
{example < 4} 

J'ai essayé un certain nombre d'expressions régulières, mais tous semblent continuer après la clôture} et y compris HTML qui a < ou> . Par exemple, j'ai essayé cette regex

{.*?(<|>).*?} 

mais qui se termine le texte correspondant à ceci:

{if true}<b>testing</b>{/if} 

Il semble assez simple, tout texte entre {} qui contiennent ou <>.

Répondre

4

Cela devrait faire l'affaire:

{[^}]*(<|>).*} 
+2

J'ai voté, mais vous devez vraiment rendre le. * match paresseux ou le remplacer par un autre [^}] * pour éviter les problèmes de greedyness s'il y aura jamais plusieurs ensembles sur le –

+0

Vous auriez besoin du modificateur ungreedy, sinon la première classe de caractères engloutira tout jusqu'à ce que le premier caractère '}' ... – ircmaxell

+0

vient d'ajouter un? après. * pour le rendre gourmand et il fonctionne correctement avec plusieurs matchs sur la même ligne. –

0
{[^}]*?(<|>)[^{]*?} 

essayer. Notez que j'ai remplacé le . avec une classe de caractères qui signifie tout sauf les accolades gauche/droite.

0

Avez-vous essayé d'utiliser le commutateur Ungreedy (U)?

1

Une façon encore plus efficace regex (parce qu'il n'y a pas de correspondance non gourmand):

'#{[^}<>]*[<>]+[^}]*}#' 

La raison pour laquelle il n'y a pas entre parenthèses dans la troisième classe de caractères est pour qu'elle corresponde à cordes avec plus d'un> (comme {foo <> bar} ...

Questions connexes