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 chaine avec des quotes


Sujet :

Collection et Stream Java

  1. #1
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut regexp chaine avec des quotes
    bonjour,

    je ne maitrise absolument pas les regexp et je souhaite découper une chaine du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "chaine" 2 "autre chaine"
    dans un 1er temps je me suis dis que j'allais récupérer les chaines entre quote (mon objectif final est de récupérer chaque éléments, soit dans l'exemple 3 chaines)
    après avoir lu la doc et quelques exemples j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Pattern pattern = Pattern.compile("\"(.*)\"");
    Mais cette expression ne me ramène rien du tous
    Merci d'avance pour votre aide
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Membre éclairé Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 672
    Points
    672
    Par défaut
    Les regexs ne sont peut etre pas forcement pertinentes dans ce cas

    peut etre qu'un simple split peut etre plus efficace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    String chaine = "\"chaine\" 2 \"autre chaine\"";
        String[] chaineSplit = chaine.split("\"");
        for(String sousChaine : chaineSplit){
            if (!sousChaine.equals(""))
            System.out.println(sousChaine);
        }
    Sinon, avec les regex, tu peux faire ça, mais je suis pas convaincu que ca soit super comme solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        Pattern pattern = Pattern.compile("([^\"]*)");
        Matcher matcher = pattern.matcher("\"chaine\" 2 \"autre chaine\"");
        while (matcher.find()) {
            if (!matcher.group().equals(""))
            System.out.println(matcher.group());
        }

  3. #3
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Merci beaucoup zorm pour ta réponse !

    petite précision il se trouve que la methode split (sur string) utilise aussi Pattern donc il n'est pas plus lent et tu peux donc utilisé l'expression de l'exemple 1 dans l'exemple 2

    malheureusement tes deux solutions ne marche pas car si tu prend la chaine suivante le résultat est incorrect
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "chaine" 1 2 "autre chaine"
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    j'avais mal exprimé le besoin en fait, ce que je souhaite, c'est spliter une chaine du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "chaine" 1 2 "autre chaine"
    dont le résultat sera le tableau suivant : [chaine, 1, 2, autre chaine]

    merci d'avance !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 672
    Points
    672
    Par défaut
    Salut, ton problème n'est pas simple effectivement, voila un pseudo code qui releve plus du bidouillage que d'une solution optimale.

    J'en suis pas vraiment fière mais ca marche a peu près:

    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
    20
    21
    22
    23
    24
    25
    26
        Pattern pattern = Pattern.compile("([^ ]*)");
        Matcher matcher = pattern.matcher("\"chaine\" 1 2 \"autre chaine encore\"");
        ArrayList<String> chaineSplit = new ArrayList<String>();
        while (matcher.find()) {
            if (!matcher.group().equals("")) {
            chaineSplit.add(matcher.group());
            }
        }
        String[] chaine = new String[chaineSplit.size()];
        int i = 0;
        int iterateur = 0;
        while (i < chaineSplit.size()) {
            chaine[iterateur] = "";
            if (chaineSplit.get(i).startsWith("\"")) {
            while (!chaineSplit.get(i).endsWith("\"")) {
                chaine[iterateur] += chaineSplit.get(i) + " ";
                i++;
            }
            }
            chaine[iterateur] += chaineSplit.get(i);
            i++;
            iterateur++;
        }
        for (String s : chaine)
            if (s != null)
            System.out.println(s);

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


    Il y a un moyen plus rapide :
    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
    20
    21
    	/**
             * Retourne tous les "mots" de la chaine.
             * Un mot correspond soit :
             *  - A une suite de caractères non blanc
             *  - A une suite de caractères quelconques entre double quote
             */
    	public static List<String> getWords(String input) {
     
    		ArrayList<String> result = new ArrayList<String>();
     
     
    		Pattern pattern = Pattern.compile("((?<!\\\\)\".*?(?<!\\\\)\")|([^\"\\s]+)");
    		Matcher matcher = pattern.matcher(input);
     
    		while (matcher.find()) {
    			result.add(matcher.group());
    		}
     
    		result.trimToSize();
    		return result;		
    	}
    Explication de l'expression :

    ((?<!\\\\)\".*?(?<!\\\\)\")|([^\"\\s]+)


    • (?<!\\\\)\" Signifie : Une quote \" qui n'est pas précédé par un anti-slash (?<!\\\\)
      (lire FAQ : Pourquoi dois-je doubler/quadrupler le caractère anti-slash ('\') ?).
      C'est un peu complexe mais cela permet de gérer les quotes protégé comme dans " Hello \" World \" ! "
    • .*? signifie n'importe quel caractères un nombre quelconque de fois, en prenant la chaine la plus courte jusqu'au caractère suivant.
      Comme cela est entouré par le pattern des quotes ci dessus, cela permet de rechercher toutes les chaines entres double-quotes.
    • ([^\"\\s]+) désigne tous les caractères sauf les doubles quotes \" ou les blancs \\s


    Comme on utilise un OU entre les deux l'expressions recherchera ces deux cas


    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	String str = "\"chaine\" 1 2 \"autre chaine\" \" Hello \\\" World \\\" ! \"  ";
    	System.out.println(str);
    	System.out.println();
    	for (String word : getWords(str)) {
    		System.out.println(word);
    	}
    Affiche :
    "chaine" 1 2 "autre chaine" " Hello \" World \" ! "

    "chaine"
    1
    2
    "autre chaine"
    " Hello \" World \" ! "
    a++

  7. #7
    Membre éclairé Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 672
    Points
    672
    Par défaut
    Au moins mon intervention aura eu le mérite de faire réagir
    En plus j'aurais appris le (?<!\\\\) , je connaissais pas ça dans les regex
    Par contre, il faut supposer qu'il y aura des \ devant les quotes compris dans une chaine

  8. #8
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Merci beaucoup pour vos réponses qui résolvent mon problème !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [RegEx] Ereg() recherche chaine avec des ()
    Par PsYKrO dans le forum Langage
    Réponses: 1
    Dernier message: 16/04/2008, 22h58
  2. Traitement de chaine avec des pipes
    Par ag_77 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/10/2007, 11h37
  3. soucis de chaine avec des espaces
    Par glouffy6 dans le forum Langage
    Réponses: 10
    Dernier message: 31/07/2007, 16h40
  4. [Débutant] Scinder une chaine avec des points
    Par poiwalt dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 06/07/2007, 20h09
  5. [VB.NET] Compléter une chaine avec des espaces
    Par Lois dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/03/2005, 09h09

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