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 :

regex recalcitrante.


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 38
    Points
    38
    Par défaut regex recalcitrante.
    Bonjour a tous,


    Dans mon logiciel, je dois recuperer une suite de 3 nombres, du type "5 12 14".

    L'ancienne version du logiciel utilise une regex assez monstueuse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /[a-zA-Z]|\,|\<|\>|\=|\-|\+|\.|\_|\|\%|\#|\*|\@|\&|\?|\;|\:|\!|\|\|\|\^|\|\$|\|\~|\"|\'|\{|\(|\[|\`|\|\]|\)|\}/)

    Celle ci fonctione, mais malheuresement pas sous perl 5.004.

    J'ai donc penser a la remplacer par /(\d\s+)*/ qui fonctionne partout, mais repere aussi les @,#... alors qu'il me devrait pas.

    Quelqu'un connait il une autre facon de proceder?


    Merci.

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut Re: regex recalsitrante.
    Bonsoir,

    Citation Envoyé par ::Fistons
    Dans mon logiciel, je dois recuperer une suite de 3 nombres, du type "5 12 14".

    L'ancienne version du logiciel utilise une regex assez monstueuse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /[a-zA-Z]|\,|\<|\>|\=|\-|\+|\.|\_|\|\%|\#|\*|\@|\&|\?|\;|\:|\!|\|\|\|\^|\|\$|\|\~|\"|\'|\{|\(|\[|\`|\|\]|\)|\}/)
    Celle ci fonctione, mais malheuresement pas sous perl 5.004.
    Cette expression rationnelle, telle quelle, n'entrera certainement pas en correspondance avec des nombres ... tout au contraire !

    A moins qu'elle ne soit utilisée avec l'opérateur !~ en lieu et place de l'opérateur =~, ou si c'est l'opérateur =~, ce doit être dans un if (not ( ... ) ) ou un unless ( ... ) !

    Citation Envoyé par ::Fistons
    J'ai donc penser a la remplacer par /(\d\s+)*/ qui fonctionne partout, mais repere aussi les @,#... alors qu'il me devrait pas.

    Quelqu'un connait il une autre facon de proceder?
    Si tu veux correspondre avec des nombres dans le style "12" ou "25", il faut mémoriser plusieurs chiffres (digits), et pas un tout seul. \d+ est donc plus approprié qu'un \d tout sec

    Ensuite, le séparateur \s peut être exclu de la mémorisation, non ? Voire même, il est superflu ... Au pire, si tu veux être sûr de tomber sur un nombre bien isolé, et pas inclus dans un mot, on peut utiliser la "frontière de mot" \b.

    Une expression rationnelle du style /\b(\d+)\b/ me parait relativement appropriée ... même si je n'ai pas testée ...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut Re: regex recalcitrante.
    Salut,

    Citation Envoyé par ::Fistons
    L'ancienne version du logiciel utilise une regex assez monstueuse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /[a-zA-Z]|\,|\<|\>|\=|\-|\+|\.|\_|\|\%|\#|\*|\@|\&|\?|\;|\:|\!|\|\|\|\^|\|\$|\|\~|\"|\'|\{|\(|\[|\`|\|\]|\)|\}/)
    Et pourquoi pas une seule classe de caractères à la place de la regex monstrueuse?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /[a-zA-Z_,<\>=-+|%#*@&?;:!^$~"'{(\[`\])}]/
    lami20j

  4. #4
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Citation Envoyé par lami20j
    Et pourquoi pas une seule classe de caractères à la place de la regex monstrueuse?
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /[a-zA-Z_,<\>=-+|%#*@&?;:!^$~"'{(\[`\])}]/
    A ce moment-là, pourquoi pas

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,
    Citation Envoyé par Mr6
    A ce moment-là, pourquoi pas
    Puisque en ce moment tout caractère non chiffre sera reconnu (c'est ça qu'il veut? si ou t'es le meilleur).

    On ne sait jamais ce qu'on trouve dans un texte. En fait j'ai suis la regex et pas sa demande concernant le groupage des chiffres.

    D'ailleurs pourquoi il l'a affichée?

    Mais dans le cas ou on ne demande que des caractères non chiffre pas de problèmes, ta regex et parfaite

    lami20j

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Re,

    Citation Envoyé par Mr6
    A ce moment-là, pourquoi pas
    J'ai oublié. A ce moment-là, pourquoi pas
    lami20j

  7. #7
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    parce que j'ai rajouté l'espace dans la classe de caractère, histoire qu'il puisse garder la séparation entre les différents nombres

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Re,

    c'est vrai.
    De toute façon TMTOWTDI.

    a+

    lami20j

Discussions similaires

  1. [Regex] Plusieurs motifs
    Par sissi_l dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 29/06/2004, 14h15
  2. [jakarta][regex]Matcher mot en entier.
    Par thibaut dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 26/05/2004, 13h33
  3. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22
  4. [regex][string] replaceAll bogué ?
    Par 7eme dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/11/2003, 16h36
  5. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24

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