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 :

interprétation des regex


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut interprétation des regex
    Bonjour,
    j'ai fait un programme dans lequel je lis deux fichier et je compare mot à mot un fichier et l'autre. Il est possible que dans un fichier j'aie toto et dans l'autre toto] ce qui pour mon utilisation sera considéré comme le même mot, par conséquent j'ai utilisé une regex pour comparer :

    if ($motf1 =~ /$motf2/)

    ça fonctionne très bien dans les cas "classique" que j'avais prévu mais quand le mots correspond à un signe réservé des regex tel que ? le programme crie et ça ne fonctionne plus je suis d'ailleurs étonnée que le problème ne se soit pas également posé dans le cas de toto], j'imagine que là déjà il fait une interprétation mais que dans ce cas elle me convient...

    Est-ce que quelqu'un aurait une idée de comment je peux résoudre ce problème ?

    Merci
    casp

  2. #2
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $motif1 = quotemeta($motif1);
    quotemeta => Returns the value of EXPR with all non-"word" characters backslashed. (That is, all characters not matching /[A-Za-z_0-9]/ will be preceded by a backslash in the returned string, regardless of any locale settings.) This is the internal function implementing the \Q escape in double-quoted strings.

    Mais quotemeta risque de placer trop de backslash, je pense par exemple aux caractères pourcent, espace et virgule.

    Sinon quelque chose comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $motif1 =~ s'\?'\\?'g;
    $motif1 =~ s'\.'\\.'g;
    $motif1 =~ s'\/'\\/'g;
    ...
    Qui rajoute des backslash devant les caractères utilisés dans les expressions régulières, mais cela va être lourd.


    Si il existe une autre façon, je ne la connaîs pas.


    Et pourquoi ne pas utiliser un simple eq?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($motif1 eq $motif2)

  3. #3
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Mais quotemeta risque de placer trop de backslash, je pense par exemple aux caractères pourcent, espace et virgule.
    Ne t'inquiète pas, quotemeta() ne place pas trop de backslash, il est prévu précisément pour l'utilisation de litéraux dans des regex comme ici.

    --
    Jedaï

  4. #4
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Ne t'inquiète pas, quotemeta() ne place pas trop de backslash, il est prévu précisément pour l'utilisation de litéraux dans des regex comme ici.

    --
    Jedaï

    C'est toujours bon à savoir, je ne l'ai jamais utilisé que pour insérer des dates en DB.


    Jasmine,

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Merci beaucoup pour vos réponses mais malheureusement je ne parviens toujours pas à faire ce que je voulais. Peut-être que je me suis mal exprimée au vu de la dernière solution proposée.
    Donc ce que je voudrai c'est que si :
    $mot1 = toto
    et
    $mot2 = toto]

    le if($mot1 =~/$mot2/) me rende vrai

    tout comme dans le cas ou $mot1=toto et $mot2=toto, tant que $mot1 est contenu dans $mot2 je voudrai que le if retourne vrai et qu'il ne retourne faux par exemple que si $mot1 = toto et $mot2 = ]

    J'ai essayé avec quotemeta mais dans ce cas si j'ai toto et toto] le if est faux...ce qui ne correspond pas à ce que je veux.

    Je vous ai inspiré encore un peu ?

    Merci
    casp

  6. #6
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par casp13 Voir le message
    tant que $mot1 est contenu dans $mot2 je voudrai que le if retourne vrai et qu'il ne retourne faux par exemple que si $mot1 = toto et $mot2 = ]
    Si c'est $mot1 qui doit être contenu dans $mot2, tu dois inverser tes variables dans le if. On recherche le motif contenu entre // (ici $mot1) dans la variable placée avant le signe =~ (ici $mot2).

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 21/06/2006, 09h31
  2. Réponses: 2
    Dernier message: 19/10/2004, 09h55
  3. DBCC SQLPERF ( LOGSPACE ) Interprétation des résultats
    Par Labienus dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/07/2004, 15h50

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