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 Perl Discussion :

Expression reguliere pour les matcher aussi les mots composés avec seulement un - comme restriction.


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 36
    Points : 32
    Points
    32
    Par défaut Expression reguliere pour les matcher aussi les mots composés avec seulement un - comme restriction.
    Bonjour à tous,
    je suis à la recherche d'une expression régulier qui matcherait et capturerait les mots simples mais aussi les mots composés avec la restriction qu'il ne pourrait y avoir qu'un seul hyphen (-) par mot
    pour éviter d'avoir aaaa-ffff-aaaa mais uniquement aaaa-bbbbb.
    Je ne sais pas si c'est possible.
    Pour l'instant j'ai ca pour une phrase mais ça autorise n'importe quel nombre de '-' par mot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $pattern = ^.*?\b([\w\-]+)\b.*?$
    Merci d'avance.

  2. #2
    Membre habitué
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Points : 148
    Points
    148
    Par défaut
    Bonjour.

    sur les deux exemples donnés, voici une regex qui fonctionne:

    Code perl : 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
    use Modern::Perl;
     
    # liste des motifs de test
    my @liste_motif = (
        'aaaa-ffff-aaaa'
      , 'aaaa-bbbbb'
    );
     
    # la regex
    my $re = qr{^[^-\b]+-[^-\b]+$};
     
    # tests
    for my $i ( @liste_motif ) {
        if ( $i =~ $re ) {
                say $i, ' OK';
        } else {
                say $i, ' NOK';
        }
    }
     
    __END__

    retourne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ perl regex.pl
    aaaa-ffff-aaaa NOK
    aaaa-bbbbb OK
    Il faudrait une liste de cas plus conséquente pour tester véritablement la regex.

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Pour capturer les mots, tu dois déjà composer une pattern sans ancres de début et fin de chaîne, car sinon tout ce que tu obtiendras ce sera au mieux un seul résultat puisque ta pattern aura consommé toute la chaîne.

    Ensuite tu dois décrire correctement ta cible en elle-même ( le mot avec ou sans tiret ): \w+ (?: - \w+ )? (on place la deuxième partie avec le tiret dans un groupe non-capturant rendu optionnel par un quantificateur ?).

    Enfin, tu vérifies ce qu'il y a autour soit ni word characters, ni tirets. Pour ça, tu utilises les word boundaries \b comme tu l'a fais, mais en plus tu dois ajouter un test arrière négatif (?<! ...) et un test avant négatif (?! ...) pour t'assurer qu'il n'y a pas de tirets avant et après.

    Soit la pattern: \b (?<!-) \w+ (?: - \w+ )? \b (?!-) ou (?<![\w-]) \w+ (?: - \w+ )? (?![\w-]).

    Pour réduire un peu l'effort de recherche, tu peux passer les quantificateurs en possessif et t'affranchir du \b final.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $test = 'aaa-bbb aaaa -aaaaa bbb-bbb-bbb bbb-bbb- cccc';
     
    my $re = qr/ \b (?<!-)  \w++ (?: - \w+ )?+  (?!-) /x;
     
    my @results = ( $test =~ m/$re/g );
     
    print join "\n", @results;
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Autre solution: tu sépares avec split puis tu filtres avec grep. De cette manière tu as besoin d'utiliser deux patterns mais qui sont bien plus simples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @results = grep { !/ $\B | ^\B | -[^-]*- /x } split /[^\w-]+/, $test;
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. [WD-2007] Vérification ortographe pour les mots composés
    Par Jean GVE dans le forum Word
    Réponses: 0
    Dernier message: 24/02/2012, 10h22
  2. [RegEx] Expression reguliere pour supprimer les accents
    Par cowboydeluxe dans le forum Langage
    Réponses: 2
    Dernier message: 22/05/2009, 19h11
  3. Expression reguliere pour enlever les commentaires
    Par fafoula dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 31/07/2008, 10h00
  4. Expression reguliere pour les balises
    Par snopims dans le forum C#
    Réponses: 4
    Dernier message: 27/06/2008, 16h10
  5. Auto-complétion pour les mots clés Begin/End
    Par Alex Laforest dans le forum EDI
    Réponses: 2
    Dernier message: 21/09/2005, 21h26

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