2016-12-16 2 views
1

via Je l'ai testé mon regexmatcher ne pas retourner le numéro de groupe correct

([\S]*)[\[]([\d]+)[-]([\d]+)[\]] 

mais quand je l'utilise en Java, il ne me retourne pas au groupe trouvé dernier.

Ex: valeur - indice [1-9]

via regex101 - il me retourne "index", "1", "9"

mais en Java - "index" et " 1" seulement

Voici le morceau de code J'utilise:

String regex = "([\\S]*)[\\[]([\\d]+)[-]([\\d]+)[\\]]"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(text); 
if(matcher.find()){ 
for (int i = 0; i < matcher.groupCount(); i++) 
     System.out.println(matcher.group(i)); 
} 

Tous les indices, pourquoi cela se produit?

+0

Veuillez indiquer comment vous avez défini l'expression régulière dans le code Java. –

+0

@ WiktorStribiżew ([\ S] *) [\ [] ([\ d] +) [-] ([\ d] +) ([\]]) – DreadAngel

Répondre

4

Lorsque vous utilisez matcher.group(int), les numéros de groupe de capture commencent à 1, et non 0. De the docs:

groupes Capturer sont indexés de gauche à droite, en commençant par un. Le zéro du groupe désigne le motif entier, donc l'expression m.group(0) est équivalente à m.group().

+4

En fait, il y a un 0ème groupe, c'est l'ensemble rencontre. –

+0

@ WiktorStribiżew - Oui. Merci d'avoir fait remarquer cela. J'ajoutais juste l'extrait approprié des docs. Pour être techniquement correct, j'ai révisé ma réponse pour dire spécifiquement "capturer les numéros de groupe". –

+0

J'ai appris quelque chose de nouveau aujourd'hui. D'accord, je ne fais pas beaucoup de regex en Java. Merci. – DejaVuSansMono