2009-12-15 29 views
0

Considérez ce code:Comprendre modèle et matcher

import java.util.regex.*; 

public class Pattern3 { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 

     Pattern p = Pattern.compile("Our"); //line 1 
     Matcher m = p.matcher("Our mom and Our dad"); //line 2 

     //p.compile(mom); commented line 

     StringBuffer s = new StringBuffer(); 



     boolean found = m.find(); 

     while (found){ 
      m.appendReplacement(s, "My"); //line 3 
      found=m.find(); 
     } 

     m.appendTail(s); //line 4 
     System.out.println(s); 
    } 

} 

a) Pourquoi dois-je appeler m.appendTrail(s) sur la ligne 4 pour obtenir la chaîne non broyée?

b) Pourquoi la sortie ne change-t-elle pas lorsque je ne commente pas et que "mom" est la nouvelle expression regex?

Répondre

3

Il suffit de lire la documentation

Matcher.appendReplacement et

Matcher.appendTail

Il est tout ce qui est expliqué il l'intention d'utiliser ces deux méthodes ensemble.


Changer le modèle après avoir créé une instance d'un matcher bien sûr ne sera pas influencer le matcher déjà créé. Vous devez changer le motif avant de créer le matcher.

1

réponse à b)

Pattern.compile() est une méthode statique. Si vous décommentez p.compile();, il va créer un nouvel objet que vous rejetez (il n'est affecté à rien). Pour obtenir ce que vous vouliez, vous devez faire quelque chose comme:

p = Pattern.compile("mom");

puis obtenir un nouveau matcher à partir du modèle nouvellement créé.

0

Réponse à a)

.appendReplacement() itère le long de la chaîne matcher (« Notre mère et notre père ») et, si le motif (« Notre ») se trouve, il remplace la chaîne de remplacement (» Mon ") pour le motif (" Notre ") et met tout ce qu'il a itéré dans le StringBuffer (s). Si plus de motifs sont trouvés, cela ne fait rien. C'est-à-dire qu'il ne va rien ajouter après le dernier motif. Par conséquent, .appendTail() est appelé pour obtenir le reste de la chaîne Matcher.

m.replaceAll ("Mon"); peut être utilisé pour obtenir le même résultat.