Probleme de replaceAll()

Probleme de replaceAll() - Java - Programmation

Marsh Posté le 17-09-2002 à 15:30:28    

Bonjour a tous,
 
J'ai un probleme avec la fonction replaceAll.
Je cherche a remplacer tout les "\" par des "/".
 
Voici donc mon programme :
 

Code :
  1. class test {
  2.    
  3.    
  4.     public static void main(String [] args) {
  5.  String chaine="salut\\les\\amis";
  6.  System.out.println(chaine);
  7.  System.out.println(chaine.replaceAll("\\","/" ));
  8.     }
  9. }


 
Et hop :
 

Citation :


Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected in
ternal error near index 1
\


 
La solution serait dont de simplement utiliser "replace(char,char)".....mais pourquoi ca ne marche pas avec des strings (alors que j'ai bien mis "\\" !!)

Reply

Marsh Posté le 17-09-2002 à 15:30:28   

Reply

Marsh Posté le 17-09-2002 à 15:33:45    

parce que "\\" correspond à \


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 17-09-2002 à 15:34:16    

replaceAll prend des String en args?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 17-09-2002 à 17:04:27    

Ben parce que les types "char" et "String" sont différents, tout simplement. Mais dans ton cas, cela suffit amplement à mon avis :

Code :
  1. System.out.println(chaine.replaceAll('\\', '/'));


 
Maintenant, si tu veux vraiment pouvoir remplacer des chaînes de caractères de plus de 1 caractère de long, voici ce qu'il faut utiliser :

Code :
  1. public static String replaceAll(String source, String oldString,
  2.                                 String newString) {
  3.   final int     oldStringLength = oldString.length();
  4.   StringBuffer  buffer          = null;
  5.   for (int index = source.length(); --index >= 0; ) {
  6.     if (source.regionMatches(index, oldString, 0, oldStringLength)) {
  7.       if (buffer == null) {
  8.         buffer = new StringBuffer(source);
  9.       }
  10.       buffer.replace(index, index + oldStringLength, newString);
  11.     }
  12.   }
  13.   return ((buffer == null) ? source : buffer.toString());
  14. }


Message édité par BifaceMcLeOD le 17-09-2002 à 17:06:19
Reply

Marsh Posté le 18-09-2002 à 15:13:01    

Tout d'abord, je voudrais vous remercier pour avoir pris le temps de me repondre.
 
Bon, je ne vois pas pourquoi vous me parlez de char et de string :
 
Voici les specifications de Sun :
 

Citation :

replaceAll(String regex, String replacement)  
          Replaces each substring of this string that matches the given regular expression with the given replacement.


Donc ca devrait marcher, darklord tu dis que "\\" correspond à "\", c'est tout a fait mon intention, donc ma notation est juste.
 
Il existe une autre fonction qui utilise le type char en parametre :
 

Citation :

replace(char oldChar, char newChar)  
          Returns a new string resulting from replacing all occurrences of oldChar in this string with newChar.


 
Donc, j'en avais deduis que :
 
"test\\test".replaceAll("\\","/" )="test\\test".replace('\\','\';)
 
Hors, lorsque j'utilise replaceAll, j'obtiens l'erreur ci-dessus....
Mon code est juste, je m'interroge seulement sur la provenance de cette erreur...  

Reply

Marsh Posté le 18-09-2002 à 17:44:29    

ben oui mais le replaceAll il attend une expression régulière en premier argument, pas simplement une chaine de caratère à remplacer ...

Reply

Marsh Posté le 18-09-2002 à 17:48:59    

Au temps pour moi, quand j'ai répondu, j'avais confondu replace() et replaceAll() (je n'ai pas encore l'habitude de toutes les nouveautés du JDK1.4).  :jap:  
 
Il faudrait donc renommer ma fonction replaceAll() ci-dessus en replace() pour être cohérent.
 
benou> D'après le JavaDoc, le premier paramètre de String.replaceAll() est de type String, mais c'est un pattern d'expression régulière. Ainsi que ce même JavaDoc l'indique :

Citation :


An invocation of this method of the form :
    str.replaceAll(regex, repl)
yields exactly the same result as the expression :
    Pattern.compile(regex).matcher(str).replaceAll(repl)

Reply

Marsh Posté le 18-09-2002 à 17:53:21    

J'ai peut-être une idée : essaie de spécifier "\\\\" plutôt que simplement "\\" comme expression régulière.
 
Pourquoi ? Parce que le backslash doit être un caractère d'échappement pour Java et pour le moteur de traitement des regexps. Moralité, la chaîne Java "\\\\" est en fait une chaine de 2 caractères de longueur, composée de 2 caractères backslash. Cette chaine de caractères est ensuite interprétée par le moteur de traitement de regexp, qui va utiliser le premier backslash pour "escap-er" le caractère qui le suit.  
 
Suis-je clair ?  :pt1cable:

Reply

Marsh Posté le 18-09-2002 à 17:56:20    

BifaceMcLeOD a écrit a écrit :

 
benou> D'après le JavaDoc, le premier paramètre de String.replaceAll() est de type String, mais c'est un pattern d'expression régulière. Ainsi que ce même JavaDoc l'indique :

Citation :


An invocation of this method of the form :
    str.replaceAll(regex, repl)
yields exactly the same result as the expression :
    Pattern.compile(regex).matcher(str).replaceAll(repl)






 :heink: ben c'est exactement ce que je viens de dire ...

Reply

Marsh Posté le 18-09-2002 à 18:01:10    

il a l'air fatigué Biface .... :)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 18-09-2002 à 18:01:10   

Reply

Marsh Posté le 18-09-2002 à 18:01:12    

Oui, mais "\\" est bien une expression régulière, non ?

Reply

Marsh Posté le 18-09-2002 à 18:03:09    

DarkLord a écrit a écrit :

il a l'air fatigué Biface .... :)




Tu dis ça parce que j'ai loupé ton post "parce que "\\" correspond à \"" ?  :??:  
 
Ben......... ouais. Je l'avais loupé.  :ouch:  :(  
Donc, si je comprends bien... faut que je m'rentre ! Allez coucouche, panier ! :pt1cable:  :D


Message édité par BifaceMcLeOD le 18-09-2002 à 18:04:19
Reply

Marsh Posté le 18-09-2002 à 18:09:12    

BifaceMcLeOD a écrit a écrit :

Oui, mais "\\" est bien une expression régulière, non ?




ha ... peut-être je sais pas ... j'y connais vraiment rien en regexp  :(

Reply

Marsh Posté le 18-09-2002 à 18:11:16    

BifaceMcLeOD a écrit a écrit :

 
Tu dis ça parce que j'ai loupé ton post "parce que "\\" correspond à \"" ?  :??:  
 
Ben......... ouais. Je l'avais loupé.  :ouch:  :(  
Donc, si je comprends bien... faut que je m'rentre ! Allez coucouche, panier ! :pt1cable:  :D




 
mais non ;)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 18-09-2002 à 18:19:52    

Si, si !  :D (ça s'appelle avoir du chien et être fatigué... :hap: )

Reply

Sujets relatifs:

Leave a Replay

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