2009-08-23 6 views
1

Je traite du texte en utilisant Java Regexes (1.6) qui contient des quantificateurs et je souhaite retourner le nombre et les valeurs des groupes correspondants. Un exemple simple est:Dans une regex Java avec Quantifiers comment puis-je obtenir les groupes correspondants?

A BC DEF 1 23 456 7 XY Z 

qui est adapté par:

([A-Z]+){0,9} (\d+){0,9} ([A-Z]+){0,9} 

Comment puis-je trouver le numéro de chaque capture (ici 3 4 2) et les valeurs ("A", "BC" , "DEF", "1", "23", "456", "7", "XY", "Z"). Les regex sont créés en dehors du programme, mais je peux les concevoir pour résoudre ce problème si possible.

Répondre

3

Lorsque vous faites correspondre un groupe plus d'une fois, il n'est pas possible d'obtenir toutes les captures. Vous pouvez remodeler votre regex comme ceci:

((?:[A-Z]+ ?){0,9}) ((?:\d+){0,9}) ((?:[A-Z]+ ?){0,9}) 

qui vous donnera les captures "Un DEF BC", "1 23 456 7" et "XY Z", que vous pouvez ensuite partager sur les espaces.

+0

Merci. Je pensais que je devrais faire cela et il est utile de le confirmer. Depuis que j'ai déjà analysé l'expression régulière dans des groupes de capture potentiels, je peux les utiliser pour analyser les plus grandes captures –

1

Si vous utilisez une quantité sur un groupe correspondant, le groupe correspondant retournera uniquement le dernier correspondant. Je veux dire pour:

String s = "a ab abc"; 
Pattern p = Pattern.compile("(\w+){3}"); 
Matcher m = p.matcher(s); 
if (m.match()) { 
    // m.group(1) will equal "abc"; 
} 

L'alternative dans votre cas est de faire quelque chose comme ceci:

String s = "A BC DEF 1 23 456 7 XY Z"; 
Pattern p = Pattern.comopile("([A-Z]+|\d+)"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    // print the group 
} 

Je me rends compte que ne pas tout à fait la même sémantique que votre regex (dans l'ordre de groupes de lettres et de groupes de chiffres) mais c'est un début. Vous pouvez mettre en place ce type d'état en vous contrôlant si vous le souhaitez.

Questions connexes