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

Langage Java Discussion :

Problème avec Pattern.quote(str) dans les expressions Régulières


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Problème avec Pattern.quote(str) dans les expressions Régulières
    Bonjour,

    Je suis confronté à un problème lorsque j'utilise les expressions régulières.

    Voici ce que j'essaye de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Voici mon pattern
    Pattern pattern = Pattern.compile("^(.*) was uplo\\*ded to album (.*) successfully");
    // Voici la chaîne de caractères que je souhaite faire matcher avec mon pattern
    Matcher matcher = pattern.matcher(Pattern.quote("TEST_MEDIA was uplo*ded to album TEST_ALBUM successfully"));
    matcher.find();
    // ça me retourne \QTEST_MEDIA
    System.out.println(matcher.group(1));
    Je comprends très bien que j'ai un \Q devant ma chaîne à cause de la méthode Pattern.quote(). Cependant, j'ai besoin d'utiliser Pattern.quote() car la chaîne que je souhaite faire matcher peut contenir des caractères à échapper comme le caractère étoile dans mon exemple.

    Mon souci est qu'au final je souhaiterais avoir en résultat sur "TEST_MEDIA" et non "\QTEST_MEDIA".

    Y a-t-il un moyen simple de remplacer tous les caractères insérés par Pattern.quote() ?

    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Bonjour,

    La méthode Pattern.quote est à appliquer si nécessaire au pattern et non à la données à analyser.

    Pattern.quote est utilisée si le pattern provient d'une source non contrôlée (EX: saisie d'un utilisateur).
    Bien le bonjour chez vous
    Jowo

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par jowo Voir le message
    Bonjour,

    La méthode Pattern.quote est à appliquer si nécessaire au pattern et à la données à analyser.

    Pattern.quote est utilisée si le pattern provient d'une source non contrôlée (EX: saisie d'un utilisateur).
    Merci pour ta réponse. En effet ma source n'est pas contrôlée, j'ai donc besoin de Pattern.quote. J'ai suivi tes conseilles mais le pattern et la donnée à analyser ne match plus maintenant :-/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Pattern pattern = Pattern.compile(Pattern.quote("(.*) was uplo\\*ded to album (.*) successfully"));
    		Matcher matcher = pattern.matcher(Pattern.quote("TEST_MEDIA was uplo*ded to album TEST_ALBUM successfully"));
    	    matcher.find();
    	    System.out.println(matcher.group(1));
    Exception in thread "main" java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Unknown Source)

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Pattern.Quote sert à protéger la "pattern", pas a protéger les données que tu analyse. Celles là doivent être utilisées telles quelles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Pattern pattern = Pattern.compile("^(.*) was uplo\\*ded to album (.*) successfully");
    Matcher matcher = pattern.matcher("TEST_MEDIA was uplo*ded to album TEST_ALBUM successfully");
    matcher.find();
    System.out.println(matcher.group(1)); // affiche bien TEST_MEDIA

  5. #5
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Pattern.quote() ne doit jamais être utilisé sur la chaine que tu passes à matcher(), mais seulement pour compiler le pattenr.
    Mais surtout il doit être utilisé seulement si tu ne veux pas que les caractères spéciaux soit interprétés, ce qui n'est pas ton cas.

    Bref tu n'en as pas besoin !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Pattern pattern = Pattern.compile("(.*) was uplo\\*ded to album (.*) successfully");
    Matcher matcher = pattern.matcher("TEST_MEDIA was uplo*ded to album TEST_ALBUM successfully");
    if (matcher.find()) {
    	    System.out.println(matcher.group(1));
    }

    a++


    [edit] Grillé

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Merci pour votre aide, cela devient plus maintenant.
    Cependant, je ne pas être certain de ce que je vais avoir dans la chaine de caractères à analyser. Si par exemple j'ai le caractère '\' en plein millieu de ma chaîne ça plante ...

    Ce code là marche trés bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Pattern pattern = Pattern.compile("(.*) was uplo\\*ded to album (.*) successfully");
    Matcher matcher = pattern.matcher("TEST_MEDIA.jpg was uplo*ded to album TEST_ALBUM/TEST/TEST successfully");
    matcher.find();
    System.out.println(matcher.group(1)+"\n");
    System.out.println(matcher.group(2)+"\n");

    Mais là non et c'est normal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Pattern pattern = Pattern.compile("(.*) was uplo\\*ded to album (.*) successfully");
    Matcher matcher = pattern.matcher("TEST_MEDIA.jpg was uplo*ded to album TEST_ALBUM\TEST\TEST successfully");
    matcher.find();
    System.out.println(matcher.group(1)+"\n");
    System.out.println(matcher.group(2)+"\n");
    En faite je cherche un moyen de me prémunir des caractères qui vont me faire planter la regex. Malheureusement je ne sais pas à l'avance ce que pourra contenir ma chaîne à analyser :-/

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par bru1985 Voir le message
    Mais là non et c'est normal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Pattern pattern = Pattern.compile("(.*) was uplo\\*ded to album (.*) successfully");
    Matcher matcher = pattern.matcher("TEST_MEDIA.jpg was uplo*ded to album TEST_ALBUM\TEST\TEST successfully");
    matcher.find();
    System.out.println(matcher.group(1)+"\n");
    System.out.println(matcher.group(2)+"\n");
    En faite je cherche un moyen de me prémunir des caractères qui vont me faire planter la regex. Malheureusement je ne sais pas à l'avance ce que pourra contenir ma chaîne à analyser :-/
    euh là, c'est normal, ça ne compile même pas ! Dans une chaine, pour mettre un antislash, il faut l'échapper, c'est-à-dire le doubler, sinon il est censé est combiné avec le caractère suivant, pour faire un caractère spécial, comme \n, ou \r, ou encore \t, par exemple. \T n'existe pas et donc ça ne compile pas.

    Aucun caractère (dans la chaine où tu fais la recherche, parce que pour le regex, oui c'est possible), ne fera planter aucune regex : au pire, la regex ne permet pas de trouver ce que tu cherches... La problématique du quoting est uniquement pour éviter que les métacaractères et les séquences d'échappement de la regex soit traités en tant que tels, et non comme les caractères eux-même : il s'agit de pouvoir matcher une regex prise litéralement et non interprétée.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu confond la partie gérée par la classe Pattern, pour lequel, dans de rares cas, le quote est utile, de la partie gérée directement par le compilateur, pour laquelle il est stipulé dans le language que tu dois doubler les \dans une String.

    Si ton utilisateur entre \T dans le fichier ou sa boite de dialogue, tu n'aura aucun problème, ton seul problème ici, c'est que tu as écrit \T dans le code source.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    En effet, je faisais une confusion entre le pattern et la chaîne de caractères à analyser.

    Pour conclure, j'ai fait un petit test en passant en argument du main : "TEST_MEDIA.jpg was uplo*ded to album TEST\n_AL?B<UM>\TEST/T\E\ST successfully"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public static void main(String[] args) {
    Pattern pattern = Pattern.compile("(.*) was uplo\\*ded to album (.*) successfully");
    	    String chaine = args[1];
    	    System.out.println("Ma chaîne à analyser : "+chaine);
    	    Matcher matcher = pattern.matcher(chaine);
       	    matcher.find();
    	    System.out.println("Groupe 1 : "+matcher.group(1)+"\n");
    	    System.out.println("Groupe 2 : "+matcher.group(2)+"\n");    
    	}
    J'ai bien le résultat attendu :

    Ma chaîne à analyser : TEST_MEDIA.jpg was uplo*ded to album TEST\n_AL?B<UM>\TEST/T\E\ST successfully
    Groupe 1 : TEST_MEDIA.jpg

    Groupe 2 : TEST\n_AL?B<UM>\TEST/T\E\ST

    Merci beaucoup pour votre aide.

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

Discussions similaires

  1. [AC-2010] Problème avec MSCOMCTL.OCX inexistant dans les Références
    Par Razmote dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/11/2014, 17h45
  2. [RegEx] Perdu dans les expression régulières
    Par chatlumo dans le forum Langage
    Réponses: 5
    Dernier message: 01/06/2012, 15h44
  3. [ADO][SqlServer] Pb avec les paramètres dans les expressions
    Par pitango dans le forum Bases de données
    Réponses: 13
    Dernier message: 22/05/2007, 18h34
  4. [VB.net][vs2005] Problème avec les expressions régulières
    Par zouhib dans le forum Windows Forms
    Réponses: 13
    Dernier message: 22/06/2006, 15h56
  5. Problème avec les expressions régulières
    Par Premium dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 18/06/2006, 16h41

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