web-dev-qa-db-fra.com

Fonctionnement de Matcher.find ()

Je teste un petit talon de classe Matcher et Pattern ... voir le petit talon suivant ..

package scjp2.escape.sequence.examples;

import Java.util.regex.Matcher;
import Java.util.regex.Pattern;

public class Sample_19 {

    public static void main(String a[]){
        String stream = "ab34ef";
        Pattern pattern = Pattern.compile("\\d*");

        //HERE * IS GREEDY QUANTIFIER THAT LOOKS FOR ZERO TO MANY COMBINATION THAT 
        //START WITH NUMBER 
        Matcher matcher = pattern.matcher(stream);

        while(matcher.find()){
            System.out.print(matcher.start()+matcher.group());
        }
    }

}

Ici ... notre chaîne que nous comparons est "ab34ef". qui est de longueur 6.

Non, voyons l'itération ...


Itération NO matcher.start () matcher.group ()

dix ""

2 1 ""

3 2 34

4 4 ""

5 5 ""

Maintenant ..let combine ... matcher.start () + matcher.group () .... la sortie selon notre calcul est: 0123445

Mais, le talon génère 01234456.

Je n'arrive pas à comprendre d'où vient le "6". L'index de chaîne commence à zéro et donc ici, il peut y avoir un index maximum de 5.Donc d'où vient 6

Il parcourt la boucle six fois ... Comment? Toute suggestion ?

16
Gunjan Shah

Votre expression régulière peut correspondre à zéro caractère. La correspondance finale est une chaîne de largeur nulle apparaissant à la fin de la chaîne, après le caractère à l'index 5. L'index de cette chaîne de largeur nulle est donc 6.


En passant, vous pourriez également trouver plus facile de comprendre ce qui se passe si vous utilisez des séparateurs pour rendre la sortie plus lisible:

System.out.println(matcher.start()+ ": " + matcher.group());

Résultats:

0: 
1: 
2: 34
4: 
5: 
6: 

idéone

15
Mark Byers

Votre expression utilise * cela signifie 0 chiffre ou plus, donc ne peut correspondre à aucun chiffre aussi.

Modifiez votre expression régulière de cette façon

Pattern pattern = Pattern.compile("\\d+");

En utilisant + signifie 1 ou plus.

9
dash1e