2009-07-09 5 views
2

J'ai une expression régulière pour correspondre à quelque chose entre {et} dans ma chaîne.Comment faire correspondre le résultat possible intérieur avec des expressions régulières

"/{.*}/"

n'a pas pu être plus simple. Le problème se pose lorsque j'ai une seule ligne avec plusieurs correspondances. Donc, si j'ai une ligne comme ceci:

ceci est ma {string}, il fait correctement

pas {} Le travail regex correspondra

{string}, il ne {} travail

plutôt que

{string}

Comment puis-je l'obtenir juste correspondre au premier résultat?

Répondre

11

Question-mark signifie "non gourmand"

"/{.*?}/" 
+0

C'est plus lisible, je pense. – mkb

+0

Je ne sais pas si vous aurez des accolades imbriquées mais cela ne retournera pas les résultats désirés si elles sont là. pour {aaa {bbb} ccc}, il retournera {aaa {bbb}. – Victor

+0

Cela fonctionne comme prévu, même si le point de Victor est bon. Peut-être un sujet pour un autre poste ... – Travis

3

Utilisez une classe de caractères qui comprend tout sauf un crochet droit:

/{[^}]+}/ 
+0

Ceci est une meilleure habitude que la réponse acceptée. Pour une expression régulière plus complexe, ceci ne sera pas la proie d'un retour en arrière catastrophique. http://www.regular-expressions.info/catastrophic.html –

0

Le comportement par défaut est correspondant gourmand, à savoir d'abord {dernier } Utilisez paresseux correspondant par le? . Après votre *,

/{.*?}/ 

ou même plutôt que * utiliser "pas}"

/{[^}]*}/ 
1

cela va fonctionner avec des accolades imbriquées avec seulement une profondeur d'un: {(({.*?})*|.*?)*}

I Je ne sais pas comment obtenir une profondeur infinie ou si c'est même possible avec regex

Questions connexes