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 :

Déchiffrement d'une regex : ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut Déchiffrement d'une regex : ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"
    Bonjour,
    je trouve cette expression dans une fonction auxiliaire utilisée par un MOOC sur la programmation en Java de l'Université de San Diego.
    Le MOOC ne porte en rien là-dessus, et il ne s'agit donc pas pour moi de faire faire mes «*devoirs*» par la communauté.
    Je trouve l'expression en question dans cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    			String[] columns = row.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
    qui traite des lignes d'une table .csv, dont certains champs contiennent des données entre guillemets (on peut même avoir un champ vide entre guillemets : "").
    Bien qu'ayant quelques notions basiques en matière d'expressions régulières, je ne parviens pas bien à désemmêler celle-ci, malgré une consultation de la documentation d'Oracle sur les expressions régulières utilisées par Java (Regular expressions).
    En particulier, je n'arrive pas à retrouver l'usage du signe '=' qu'on voit ici.
    Tout éclaircissement sera le bienvenu.

  2. #2
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    J'ai progressé d'un cran, en regardant ceci : Regular expresions (Princeton).
    Page 54 je trouve ce passage :
    Positive and Negative Lookahead

    Negative lookahead is indispensable if you want to match something not followed by something else. When
    explaining character classes, I already explained why you cannot use a negated character class to match a “q”
    not followed by a “u”. Negative lookahead provides the solution: « q(?!u) ». The negative lookahead
    construct is the pair of round brackets, with the opening bracket followed by a question mark and an
    exclamation point. Inside the lookahead, we have the trivial regex « u ».

    Positive lookahead works just the same. « q(?=u) » matches a q that is followed by a u, without making the u
    part of the match. The positive lookahead construct is a pair of round brackets, with the opening bracket
    followed by a question mark and an equals sign. You can use any regular expression inside the lookahead.
    (Note that this is not the case with lookbehind. I will explain why below.) Any valid regular expression can
    be used inside the lookahead. If it contains capturing parentheses, the backreferences will be saved.
    Note that the lookahead itself does not create a backreference. So it is not included in the count towards
    numbering the backreferences. If you want to store the match of the regex inside a backreference, you have
    to put capturing parentheses around the regex inside the lookahead, like this: « (?=(regex)) ».
    The other way around will not work, because the lookahead will already have discarded the regex match
    by the time the backreference is to be saved.

  3. #3
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Du coup, cela semble signifier qu'on peut prendre une virgule comme séparateur si :
    - si elle est séparée de la fin de la ligne ($) par une suite de caractères ne contenant aucun guillemet ([^\"]*\"[^\"]*\")* correspond à une suite de caractères nulle et on a une suite nulle ou non nulle correspondant à [^\"]*).
    - ou bien si elle est séparée de la fin de la ligne par un nombre pair de guillemets (([^\"]*\"[^\"]*\")* correspond à une suite de caractères non nulle, qui contient une ou plusieurs fois deux guillemets)
    - rien d'autre n'est possible et donc pas une virgule suivie d'un nombre impair de guillemets (et donc une virgule entre deux guillemets dans un champ qui serait du genre "Bratislav, 05" ne peut être prise comme séparateur.

    Mon explication n'est donc pas d'une grande limpidité mais en gros, je crois que c'est ça.
    Non ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 565
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 631
    Points
    21 631
    Par défaut
    Hello,

    Ouaip, c'est exactement ça. Bien vu.

    Évidemment, cette méthode est incapable de détecter si une ligne ne respecte pas le format du CSV.

  5. #5
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Merci pour la confirmation.

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

Discussions similaires

  1. regex remplacer toutes les virgules entre double quote
    Par GregHory dans le forum Langage
    Réponses: 13
    Dernier message: 04/09/2015, 16h19

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