IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

[Regexp] remplacement caractere "*" & "\\" & "?"


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Par défaut [Regexp] remplacement caractere "*" & "\\" & "?"
    Bonjour,

    Mon application plante dés que j'essais de remplacer ces caractères "*\?", pourtant je dois bien les filtrer car sous windows il est impossible de créer un repertoire avec ces caractères

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     if(!requete.getText().equals("")){
                  //création de l'arborescence
                  path = zepath.getText();//+"/"+requete.getText(); //gestion de l'arborescence
                  File fb = new File(path);
                  fb.mkdirs();
                  requete4nomdossier = requete.getText();
                  requete4nomdossier=requete4nomdossier.replaceAll(":","_");
                //requete4nomdossier=requete4nomdossier.replaceAll("\\","");
                  requete4nomdossier=requete4nomdossier.replaceAll("<"," ");
                  requete4nomdossier=requete4nomdossier.replaceAll(">"," ");
                  requete4nomdossier=requete4nomdossier.replaceAll("|"," ");
                //requete4nomdossier=requete4nomdossier.replaceAll("?"," ");
                  requete4nomdossier=requete4nomdossier.replaceAll("/"," ");
                //requete4nomdossier=requete4nomdossier.replaceAll("*"," ");
     
                  path = zepath.getText()+"/"+requete4nomdossier; //gestion de l'arborescence
                  File fb2 = new File(path);
                  fb2.mkdirs();
    j'ai le message
    Exception in thread "AWT-EventQueue-0" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
    \
    ^
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.lang.String.replaceAll(Unknown Source)
    at ihm.initrecherche(ihm.java:749)
    at ihm$1.actionPerformed(ihm.java:208)
    at javax.swing.JTextField.fireActionPerformed(Unknown Source)
    at javax.swing.JTextField.postActionEvent(Unknown Source)
    at javax.swing.JTextField$NotifyAction.actionPerformed(Unknown Source)
    at javax.swing.SwingUtilities.notifyAction(Unknown Source)
    at javax.swing.JComponent.processKeyBinding(Unknown Source)
    at javax.swing.JComponent.processKeyBindings(Unknown Source)
    at javax.swing.JComponent.processKeyEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
    qui s'affiche, quelque soit ma requête

    Si quelqun a une idée ...

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Certains de ces caractères sont interprétés de manière spécifique par les regexp. Par exemple * signifie que l'élément précédent peut être présent 0 ou plusieurs fois...
    Donc si tu les utilises mal l'expression régulière est incorrecte et provoquera une exception !

    Tu dois les protéger avec un double \ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete4nomdossier=requete4nomdossier.replaceAll("\\*"," ");
    a++


    [edit] PS : Pour un remplacement caractère par caractère tu peux utiliser directement replace(char,char)...

  3. #3
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Pour l'anti-slash essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    requete4nomdossier=requete4nomdossier.replaceAll("<a href="http://www.developpez.net/forums/" target="_blank">\\\\</a>","");
    Donc pour les caractères ? et *, tu dois les faire précéder de \\ car ce sont aussi des caractères spéciaux.

    Chris

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Un petit coup d'oeil dans la javadoc t'aurait indiqué que la méthode replaceAll() de la classe String attend une expression régulière pour son premier paramètre.
    Les caractères '*', '?', '\' sont des caractères réservés pour les expressions régulières tu dois donc les échapper.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    requete4nomdossier = requete4nomdossier.replaceAll("\\\\"," ");
    requete4nomdossier = requete4nomdossier.replaceAll("\\*"," ");
    requete4nomdossier = requete4nomdossier.replaceAll("\\?"," ");
    d'ailleurs il en est de même pour le caractère '|'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    requete4nomdossier = requete4nomdossier.replaceAll("\\|"," ");
    Remarque : tu peux utiliser les expressions régulières pour simplifer ton code et réduire les appels à la méthode replaceAll()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     requete4nomdossier = requete4nomdossier.replaceAll(":", "_").replaceAll("\\\\|<|>|\\||\\?|/|\\*"," ");
    Remarque2 : Plus d'info sur les expressions régulières dans la javadoc de la classe Pattern.

    [edit] vraiment trop lent [/edit]
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Par défaut
    Merci merci, tous les carractères marchent maintenant
    Je viens même de l'adapter à mon Windows ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    if(!requete.getText().equals("")){
                  //création de l'arborescence
                  path = zepath.getText(); //gestion de l'arborescence
                  File fb = new File(path);
                  fb.mkdirs();
                  if(System.getProperty("os.name").startsWith("Windows"))  
                  {
                   requete4nomdossier = requete.getText();
                   requete4nomdossier = requete4nomdossier.replaceAll(":|\\\\|/", "_").replaceAll("<|>|\\||\\?|/|\\*"," ");
     
                   path = zepath.getText()+"/"+requete4nomdossier; //gestion de l'arborescence
                  File fb2 = new File(path);
                  fb2.mkdirs();
                  }
                  else {
                	  path = zepath.getText()+"/"+requete.getText(); //gestion de l'arborescence
                      File fb2 = new File(path);
                      fb2.mkdirs();
                  }
    thx all

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/03/2009, 14h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo