[JAVA] regex, pattern, matcher et group sont dans un bateau

regex, pattern, matcher et group sont dans un bateau [JAVA] - Java - Programmation

Marsh Posté le 05-08-2004 à 11:58:18    

bonjour
 
je voudrais remplacer plusieurs chaines de caractères par elles-mêmes plus une ou plusieurs autres chaines de caractères.
les chaines à matcher sont dans String[] keywordsTab, le texte a modifier dans String textStr, je boucle sur keywordTab et je recherche chaque chaine individuellement.
 
mon problème : je n'arrive pas a récupérer ce qui a été réellement matché. pour respecter la case par exemple je ne peux pas insérer mon keywordsTab[i] au milieu du texte.
j'ai vu que la méthode group(int) premettait de récupérer le résultat de la recherche précédente mais tout ce que j'ai c'est  

Citation :

java.lang.IndexOutOfBoundsException: No group 1
 java.util.regex.Matcher.group(Unknown Source)


 

Code :
  1. String[] keywordsTab = { "hello", "world" };
  2. String textStr = "Hello world ! this is my first program.";
  3. for (int i = 0; i < keywordsTab.length; i++) {
  4. Pattern p = Pattern.compile(keywordsTab[i],Pattern.CASE_INSENSITIVE);
  5. Matcher m = p.matcher(textStr);
  6. //m.replaceAll("_"+keywordsTab[i]+"_" );
  7. StringBuffer sb = new StringBuffer();
  8. for (int tmp = 1; m.find(); tmp++) {
  9.  m.appendReplacement(sb, "_"+m.group(tmp)+"_" );
  10. }
  11. m.appendTail(sb);
  12. }
  13. System.out.println(sb.toString());


 
si vous avez une idée je suis preneur :)
 
edit: le code en commentaire fonctionne mais je ne peux pas récuperer ce qui a été matché :/


Message édité par lint le 05-08-2004 à 13:33:44

---------------
\@/
Reply

Marsh Posté le 05-08-2004 à 11:58:18   

Reply

Marsh Posté le 05-08-2004 à 12:01:35    

poste plus de code (la regexp, la déclaration du tableau, etc...)


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 05-08-2004 à 13:34:58    

édité, je vois pas trop ce que je pourrais mettre de plus :/


---------------
\@/
Reply

Marsh Posté le 05-08-2004 à 13:42:29    

essaye ca :

Code :
  1. Pattern p = Pattern.compile(keywordsTab[i]+ "",Pattern.CASE_INSENSITIVE);

pour tester
 
et regarde si le matcher renvoie qqc


Message édité par Jubijub le 05-08-2004 à 13:43:01

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 05-08-2004 à 13:53:26    

ca change rien :/

Citation :

m.groupCount() = 0


---------------
\@/
Reply

Marsh Posté le 05-08-2004 à 13:57:47    

moi g ça comme output :  

Code :
  1. _Hello_ world ! this is my first program.
  2. Hello _world_ ! this is my first program.


 
je crois que ta boulette est là :  

Code :
  1. public class Test {
  2.     public static void main(String[] args) {
  3.         String[] keywordsTab = { "hello", "world" };
  4.         String textStr = "Hello world ! this is my first program.";
  5.        
  6.         for (int i = 0; i < keywordsTab.length; i++) {
  7.            Pattern p = Pattern.compile(keywordsTab[i],Pattern.CASE_INSENSITIVE);
  8.            Matcher m = p.matcher(textStr);
  9.            
  10.            //m.replaceAll("_"+keywordsTab[i]+"_" );
  11.            StringBuffer sb = new StringBuffer();
  12.            for (int tmp = 0; m.find(); tmp++) {
  13.               m.appendReplacement(sb, "_"+m.group(tmp)+"_" );
  14.            }
  15.            m.appendTail(sb);
  16.            System.out.println(sb.toString());
  17.         }
  18.        
  19.        
  20.     }
  21. }


 
g tjs le count à 0, mais ca replace qd même


Message édité par Jubijub le 05-08-2004 à 14:00:04

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 05-08-2004 à 14:06:05    

okay je viens de comprendre
 

Citation :

Capturing groups are indexed from left to right, starting at one. Group zero denotes the entire pattern, so the expression m.group(0) is equivalent to m.group().


http://java.sun.com/j2se/1.4.2/doc [...] group(int)
 
je pensais devoir eviter group(0) mais en fait c'est justement ce que je voulais
 
merci :jap:


---------------
\@/
Reply

Marsh Posté le 05-08-2004 à 14:07:00    

public class Test {
 
    public static void main(String[] args) {
        String[] keywordsTab = { "hello", "world" };
        String textStr = "Hello world ! this is my first program.";
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < keywordsTab.length; i++) {
           Pattern p = Pattern.compile(keywordsTab[i],Pattern.CASE_INSENSITIVE);
           Matcher m = p.matcher(textStr);
           
             
           //m.replaceAll("_"+keywordsTab[i]+"_" );
           
           for (int tmp = 0; m.find(); tmp++) {
              m.appendReplacement(sb, "_"+m.group(tmp)+"_" );
              System.out.println(m.group());
           }
           m.appendTail(sb);
 
        }
        System.out.println(sb.toString());      
    }
}
 
ca ca marche ...lol ben c bon t'a trouvé...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 05-08-2004 à 14:09:12    

nan en fait spa vraiment ca mais ca me fait déjà pas mal avancer :D
merci


---------------
\@/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed