2010-09-10 8 views
3

Je veux extraire tous mots entre accolades, donc j'ai une expression comme celle-ciComment extraire des mots entre accolades en utilisant des expressions régulières?

foo {bar} moo {mar} 

La chaîne en fonction peut avoir un certain nombre de ces mots, mais je commence à penser que je » J'aborde ce problème de la mauvaise façon.

Ma tentative

Et j'ai essayé d'extraire les mots accolades en groupes afin que je puisse utiliser chaque match. Donc, j'ai fait une regex:

String rx = ".*\\{({GROUP}\\w+)\\}.*"; 

Note: J'utilise la syntaxe JRegex donc je dois échapper quelques-unes des Curlies.

Résultat

Le résultat que je reçois est un (mais correct) correspondent bar, alors que je me attends deux matches bar et mar. Qu'est-ce que j'ai mal compris, et comment le corriger? J'ai probablement besoin d'utiliser un autre quantificateur pour la partie ., mais j'espère que vous pourrez m'aider aussi.

Merci beaucoup d'avance!

+0

Les accolades peuvent-elles être imbriquées? – MAK

Répondre

5

Votre regex .*\{({GROUP}\w+)\}.* ne fonctionne pas car il correspond à toutes vos chaîne d'entrée en une seule fois:

  • .* matchs foo
  • \{({GROUP}\w+)\} matchs {bar}
  • .* matchs moo {mar}

Vous devrait utiliser quelque chose comme ceci:

List<String> matchList = new ArrayList<String>(); 

Pattern regex = Pattern.compile("\\{([^}]*)\\}"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) 
{ 
    matchList.add(regexMatcher.group()); 
} 

accolades intérieurs ne sont pas prises en charge par ce regex

+3

"(? <= \\ {) ([^}] *) (? = \\})" regex devrait vous donner les mots sans les accolades autour d'eux. – ScArcher2

+0

Super, qui l'a résolu! – Nubsis

2

Une variante, en utilisant le modificateur réticent "*?" dans l'expression regex. Vous pouvez trouver des informations sur la additionnelles stratégie de recherche d'une expression rationnelle (avide, réticente, possessif) ici: http://javascript.about.com/library/blre09.htm

List<String> matchList = new ArrayList<String>(); 

Pattern regex = Pattern.compile("\\{(.*?)\\}"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 

Le choix de syntaxe est la vôtre. Cette regex aura le même comportement que celui de @ madgnome. Personnellement, je préfère utiliser la recherche réticente plutôt qu'une exclusion de caractères ...

+0

Merci, c'était une bonne lecture. À votre santé! – Nubsis

Questions connexes