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

avec Java Discussion :

Expressions régulières : les groupes de (non) capture


Sujet :

avec Java

  1. #1
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut Expressions régulières : les groupes de (non) capture
    Bonsoir,

    j'essaye de réaliser une expression régulière en utilisant les Pattern de java :
    http://docs.oracle.com/javase/1.4.2/...x/Pattern.html

    Dans la documentation, il y a tout un paragraphe sur les groupes de capture que je ne comprends pas à cause de mon anglais :
    Special constructs (non-capturing)
    (?:X)			X, as a non-capturing group
    (?idmsux-idmsux)	Nothing, but turns match flags on - off
    (?idmsux-idmsux:X)	X, as a non-capturing group with the given flags on - off
    (?=X)			X, via zero-width positive lookahead
    (?!X)			X, via zero-width negative lookahead
    (?<=X)			X, via zero-width positive lookbehind
    (?<!X)			X, via zero-width negative lookbehind
    (?>X)			X, as an independent, non-capturing group
    
    peut-on m'expliquer simplement ce que signifie cette syntaxe ?

  2. #2
    Modérateur

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

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

    Justement ce ne sont pas des groupes de capture. C'est-à-dire qu'ils n'apparaissent pas dans le décompte des groups() et qu'on ne peut pas les extraire. Ce ne sont pas des groupes de capture, donc.

    Le premier par exemple, c'est quand tu as besoin des parenthèses mais que tu veux pas que ça joue sur les groupes de capture (de ma vie j'en ai jamais eu besoin, mais je suppose que c'est mieux pour les perfs.)

    Ensuite il y a les syntaxes pour activer/désactiver des flags de regex. Pareil j'aime pas trop mais ça peut servir dans des cas compliqués.

    Enfin bref c'est à base de parenthèses donc ça ressemble à des groupes de capture, mais ça n'en sont pas. Ils n'ont pas spécialement de point commun les uns avec les autres, ça n'a pas vraiment de sens de les regrouper en un grand "et là, c'est tout ce qui est à base de parenthèses mais n'est pas un groupe de capture."
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    J'ai trouvé par exemple sur http://stackoverflow.com une discussion dans laquelle une personne cherche à réaliser un split sur sa chaine de caractère de la forme "810LN15" et on lui propose entre autres cette expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String source = "810LN15";
    String[] parts = source.split("(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)");
    "\d" désigne un nombre et "\D" le contraire mais "?<=" et "?=" me dépassent complètement


    Serais-tu en mesure de me donner des exemples pour chaque cas de figure afin que je comprenne ces non-groupes ? Ou connais-tu un tutoriel en français sur cette syntaxe ?

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Je ne peux pas dire que je sois sûr à 100%, mais pour moi,

    - (?<=X) signifie que tu indique une condition sur un élément situé avant le groupe
    - (?=X) signifie que tu indique une condition sur un élément situé après le groupe.

    Tu note que le résultat de "1A2".split("(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)"); est {"1", "A", "2"}. Tu remarques que le split a coupé la chaine sans rien capturer. C'est le sens, je pense, du "zero-width", mais je ne suis pas sûr.

    Au final, (?<=\\d)(?=\\D)|(?<=\\D)(?=\\d) signifie un décimal suivit d'un non-décimal, ou un non-décimal suivi d'un décimal. Les contraintes que tu définis portent sur les éléments qui entourent le groupe et non celles qui le composent.

    Dans le même style tu peux écrire :
    (?<=\\d)(?!\\d)|(?<!\\d)(?=\\d)

    Pour les autres expressions, demande sur quel élément tu voudrais des précisions ?

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par Sharcoux Voir le message
    Je ne peux pas dire que je sois sûr à 100%, mais pour moi,

    - (?<=X) signifie que tu indique une condition sur un élément situé avant le groupe
    - (?=X) signifie que tu indique une condition sur un élément situé après le groupe.
    là il me manque quelque chose pour comprendre : qu'appelles-tu "groupe" ?
    Explique moi "élément avant le groupe" et "élément après le groupe".


    Citation Envoyé par Sharcoux Voir le message
    Pour les autres expressions, demande sur quel élément tu voudrais des précisions ?
    Je cherche des exemples sur comment appliquer (?<=X) (?=X) (?!X) et tous les autres.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Tu as sûrement trouvé la réponse à ta question depuis, mais ça fera pour les autres. Désolé, j'avais pas vu que tu m'avais répondu.

    http://www.javaranch.com/journal/200...exTutorial.htm

    Voilà pour les exemples.

    Sinon, le "groupe" c'est la partie de la String que tu cherches à récupérer. Celle qui "match" la regex, càd celle qui est conforme aux contraintes décrites dans la régex.

    Par exemple si tu veux récupérer les composantes d'une couleur dans un text html, tu sais que les couleurs commencent par #, mais # ne t'intéresse pas. Tu vas faire : "(?=#)([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])"

    Le premier groupe (entre perenthèses) ne capture rien, les trois autres capturent une composante de couleur.

    En JavaScript, tu peux faire ceci :

    "test #12a2af test".split(/(?:#)([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])/g);

    Essaye dans la console d'un navigateur. Tu verras que le # est tout simplement ignoré, mais qu'il sert à définir la capture.

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

Discussions similaires

  1. treplace et expression régulière avec groupe
    Par dosy07 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 10/03/2013, 12h57
  2. Réponses: 14
    Dernier message: 30/07/2012, 10h13
  3. Expression régulière pour groupe multicast
    Par bMallo dans le forum Qt
    Réponses: 1
    Dernier message: 27/02/2012, 09h36
  4. Expressions régulières et groupes capturants
    Par ®om dans le forum Langage
    Réponses: 1
    Dernier message: 09/01/2008, 15h37
  5. [Regex] Expressions régulières: sous groupe
    Par debdev dans le forum Collection et Stream
    Réponses: 12
    Dernier message: 07/07/2005, 14h10

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