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 :

[Chaînes]Comparer / Copier / coller


Sujet :

Langage Java

  1. #1
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut [Chaînes]Comparer / Copier / coller
    Bonjour,

    J'ai un petit soucis avec deux chaînes (chaînes étant des adresses de dossiers).

    Petit ex :
    Chaine 1 : P:\open\commun\commun-serveur\target\test-classes\open\transformations\export\files
    Chaine 2 : \test-classes\open\transformations\export

    Je veux comparer la chaine 1 et 2 et récupérer tous les caractères de la chaine 1 après la partie commune avec la chaîne 2.
    Dans l'exemple précédent, récupérer dans chaine 1 \files seulement puis le concaténer à chaine 2 (cette étape le de concaténation ca va ).

    Comme faire pour comparer et copier de la chaine 1 ce qu'il y a aprés la chaine 2 ?

    Merci

  2. #2
    Membre chevronné Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Par défaut
    L'API regex de Java fait ça très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Pattern p = Pattern.compile("(.*)" + chaine2 + "(.*)");
    Matcher m = p.matcher(chaine1);
    String res = m.group(2);
    group(int) permet de récupérer les groupes de chaîne matchées par des parenthèses dans la regex. En revanche, il te faudra remplacer tous tes \ par des \\, ou plutôt les remplacer par des /.

  3. #3
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    Citation Envoyé par Rayndell
    L'API regex de Java fait ça très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Pattern p = Pattern.compile("(.*)" + chaine2 + "(.*)");
    Matcher m = p.matcher(chaine1);
    String res = m.group(2);
    group(int) permet de récupérer les groupes de chaîne matchées par des parenthèses dans la regex. En revanche, il te faudra remplacer tous tes \ par des \\, ou plutôt les remplacer par des /.
    Alors alors,

    petite tanbouille, petite modif et j'ai donc ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    vRepertoireArboParent.replaceAll("\\\\", "\\\\\\\\");
                String vRepertoireTotal = aRepertoire.getParent();
     
                vRepertoireTotal.replaceAll("\\\\", "\\\\\\\\");
     
                Pattern p = Pattern.compile("(.*)" + vRepertoireArboParent + "(.*)");
                Matcher m = p.matcher(aRepertoire.getParent());
                String res = m.group(2);
    Et une belle erreur sur le pattern :

    java.util.regex.PatternSyntaxException: Illegal/unsupported escape squence near index 18
    (.*)\test-classes\open\transformations\export(.*)
    ^
    at java.util.regex.Pattern.error(Pattern.java:1700)
    at java.util.regex.Pattern.escape(Pattern.java:2164)
    at java.util.regex.Pattern.atom(Pattern.java:1939)
    at java.util.regex.Pattern.sequence(Pattern.java:1821)
    at java.util.regex.Pattern.expr(Pattern.java:1739)
    at java.util.regex.Pattern.compile(Pattern.java:1447)
    at java.util.regex.Pattern.<init>(Pattern.java:1130)
    at java.util.regex.Pattern.compile(Pattern.java:822)
    ...

  4. #4
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    ok autant pour moi, je pensais que le remplaceAll était une void et remplacait directos ...

    J'ai ajouté ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     vRepertoireArboParent = vRepertoireArboParent.replaceAll("\\\\", "\\\\\\\\");
                String vRepertoireTotal = aRepertoire.getParent();
     
                vRepertoireTotal = vRepertoireTotal.replaceAll("\\\\", "\\\\\\\\");
    Par contre, deuxième soucis sur le group(2) :

    java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:468)

  5. #5
    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,

    Citation Envoyé par nebule
    Et une belle erreur sur le pattern :
    C'est parce que la chaine vRepertoireArboParent est interprété comme une expression régulière et non pas comme du simple texte, et les anti-slash pose problème (car ce sont des caractères spéciaux mêmes pour les regexp).

    Il faut donc protéger ta chaine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern p = Pattern.compile("(.*)" + Pattern.quote(vRepertoireArboParent) + "(.*)");
    [edit] Et pas besoin des replaceAll() dans ce cas

    Plus d'info : Comment empêcher les expressions régulières d'interpréter une sous-chaînes ?

    a++

  6. #6
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    Merci
    Y'a pas à dire, j'ai tjs du mal avec les patterns &co

    Par contre, tite question encore, à partir du code précédent, je comprend pas comment je récupére le bout de chaine APRES le bout trouvé en commun ?


  7. #7
    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
    Il faut faire un find() pour faire la recherche de l'élément.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    		String chaine1 = "P:\\open\\commun\\commun-serveur\\target\\test-classes\\open\\transformations\\export\\files";
    		String vRepertoireArboParent = "\\test-classes\\open\\transformations\\export";
     
    		Pattern p = Pattern.compile("(.*)" + Pattern.quote(vRepertoireArboParent) + "(.*)");
            Matcher m = p.matcher(chaine1);
     
            if (m.find()) {
            	System.out.println("AVANT : " + m.group(1));
            	System.out.println("APRES : " + m.group(2));
            } else {
            	System.err.println("Pas trouvé !");
            }
    a++

  8. #8
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    yes je viens de voir ça dans un autre de tes (post)

    Merci j'essaie ça !

  9. #9
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    Re,

    bon alors ca marche plutôt super mais petit soucis, il me rajoute un \E à la fin du résultat ???

    Une idée du pourquoi ?

  10. #10
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    Plus précisement je me retrouve avec ça : \QP:\open\commun\commun-serveur\target\test-classes\open\transformations\export\files\E

    au lieu de ça : P:\open\commun\commun-serveur\target\test-classes\open\transformations\export\files

    S'est quoi le \Q et \E ajouté ?

  11. #11
    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
    Citation Envoyé par nebule
    S'est quoi le \Q et \E ajouté ?
    C'est la Pattern.quote()... mais tu ne devrais pas l'utiliser là-dessus !

    On pourrait voir ton code ?

    a++

  12. #12
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    Citation Envoyé par adiGuba
    C'est la Pattern.quote()... mais tu ne devrais pas l'utiliser là-dessus !

    On pourrait voir ton code ?

    a++
    Yes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String vRepertoireArboParent = aFichierCheminSource.getParent();
                Pattern vPattern = Pattern.compile("(.*)" + Pattern.quote(vRepertoireArboParent) + "(.*)");
                Matcher vMatcher = vPattern.matcher(Pattern.quote(aRepertoire.getParent()));
                String vResultat = new String();
                if (vMatcher.find())
                {
                    vResultat = vMatcher.group(2);
                }

  13. #13
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Matcher vMatcher = vPattern.matcher(Pattern.quote(aRepertoire.getParent()));
    Tu n'as pas à utiliser Pattern.quote() dans le matcher() : la méthode matcher() attend du texte simple et non pas une expression régulière.

    Pattern.compile() ne doit être utilisé qu'au sein d'une expression régulière, et donc que dans ce que tu passes à Pattern.compile() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                String vRepertoireArboParent = aFichierCheminSource.getParent();
                Pattern vPattern = Pattern.compile("(.*)" + Pattern.quote(vRepertoireArboParent) + "(.*)");
                Matcher vMatcher = vPattern.matcher(aRepertoire.getParent());
                String vResultat = new String();
                if (vMatcher.find())
                {
                    vResultat = vMatcher.group(2);
                }
    a++

  14. #14
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    Ok, résolu, merci !!!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/02/2015, 14h19
  2. Réponses: 14
    Dernier message: 25/10/2012, 21h11
  3. Copier coller Fichier windows
    Par KPitN dans le forum Windows
    Réponses: 8
    Dernier message: 20/04/2004, 17h32
  4. Copier Coller une ligne d'une table avec modif ?
    Par nolan76 dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/03/2004, 16h34
  5. [Débutant] Conserver la couleur lors d'un copier coller
    Par ADIDASman dans le forum JBuilder
    Réponses: 2
    Dernier message: 21/05/2003, 18h13

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