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 :

Construction d'une regexp : unmatched () in regexp


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut Construction d'une regexp : unmatched () in regexp
    Bonjour,

    J'ai des codes qui peuvent etre de cette forme :
    T00221-001->M1
    T00221-005-<J
    T00541-004-*
    xsxsxsx-003-
    T00648-004-#005-<A
    scfed-007-006-
    abc1245-004->S005-+A512-#452-*

    Il faut que j'arrive a récupérer la partie ayant les 3 derniers chiffres (ceux en gras).

    Comment sont formés ces codes :
    - une ou plusieurs lettres/chiffres (longueur variable)
    - un tiret
    - 3 chiffres (ceux q je veus recuperer s'il n'y en a pas plus loin par 3
    - un tiret
    - zero ou un symbole qui peut etre <, >, +, * ou # (peut etre absent)
    - zero ou plusieurs lettres
    Le code peut s'arreter la ou bien continuer en gardant la base précedente ms en rajoutant les 4 dernieres etapes :
    - 3 chiffres (ceux q je veus recuperer s'il n'y en a pas plus loin par 3
    - un tiret
    - zero ou un symbole qui peut etre <, >, +, * ou # (peut etre absent)
    - zero ou plusieurs lettres
    Et cela peut ce reproduire plusieurs fois.

    Ceux que je veux récupérer, cest la derniere fois qu'il y a les 3 chiffres.

    Voila la regexp que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $gene = 'T00648-004-#[b]005[/b]-<A';
    if ($gene =~ /(.*)(-)([0-9]{3})([a-z]?)(-)([<->*\#])?)(.*)/)
    {
       print "ok";
    }
    else
    {
       print "no ok";
    }
    print "1 : $1<br>2 : $2<br>3 : $3<br>4 : $4<br>5 : $5<br>6 : $6<br>7 : $7";
    Mais j'ai ce message :
    /(.*)(-)([0-9]{3})([a-z]?)(-)([<->*\#])?)(.*)/: unmatched () in regexp at /Projects/aaa/fiche.cgi line 2266.
    [Fri Jan 27 09:32:48 2006] [error] [client xxx.xxx.xx.x] Premature end of script headers: /aaa/fiche.cgi
    Par contre, ce que je ne comprend pas, cest que normalement, jai un formulaire, et ce n'est qu'a la soumission de ce formulaire que j'utitlse ma regexp, donc au 1er affichage, cest sur, ma regexp ne peut pas fonctionner puisque la variable $gene n'a pas encore de valeur...

    Est ce que quelqu'un peut m'aider?

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Tu as un petit problème de parenthèse.
    Remplace ton code par celui ci corrigé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($gene =~ m/(.*)(-)([0-9]{3})([a-z]?)(-)([<->*\#])?(.*)/  )
    La parenthèse fermante juste avant le second ? etait de trop.

    Voili, voilou,

    Manuxme.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Merci, ca marche!

    Par contre, pourquoi est ce que tu mets le 'm'? ca marche bien sans?

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 23
    Points
    23
    Par défaut
    le "m" est pour traiter plusieur ligne, mais dans ton cas, tu n'en as a peut être pas besoin.
    J'ai le réflexe de le mettre en permance.

    Manuxme.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    ok! merci

  6. #6
    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
    Citation Envoyé par Manuxme
    le "m" est pour traiter plusieur ligne, mais dans ton cas, tu n'en as a peut être pas besoin.
    J'ai le réflexe de le mettre en permance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($gene =~ m/(.*)(-)([0-9]{3})([a-z]?)(-)([<->*\#])?(.*)/  )
    Non, le 'm' initial est l'opération effectuée par l'opérateur de mise en relation d'expression rationnelle "=~".

    'm' est l'opération retenue : match (ou correspondance).

    D'autres opérations sont possibles, comme "s", pour une substitution, ou "tr" pour une "traduction" ou translittération.

    Il se trouve que l'opération "m" est aussi l'opération par défaut de l'opérateur =~. Cela fonctionne donc très bien sans.

    Cependant, c'est toujours une bonne habitude de ne pas se baser sur les opérations par défaut et de préciser ce que l'on veut faire. Cela peut rendre les codes plus lisibles et plus facile à maintenir.


    Pour un traitement multilignes, ce n'est pas un indicateur en début d'expression rationnelle, mais un paramètre ajouté après la fermeture de celle-ci qu'il faudra utiliser (et le paramètre pour les lignes multiples est aussi un "m", ce qui donne une expression de la forme $var =~ m/motif/m ).
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Je savais que le s permettait la subtitution, et le m pr match, mais justement, je ne voyais pas la diffenrece entre =~ et =~ m/.../ et en fait il ny en a pas!

    Quant au "tr", je ne savais pas q ca existait

    Merci 2Eurocents pour cet eclaircissment

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 23
    Points
    23
    Par défaut
    Encore Oupsss...

    J'en suis à 2 today....
    Cela fait un moment que j'utilise des fonctions instinctivement, sans plus trop connaître la définition exact.

    Je ferais attention a mes réponses pour les prochaines fois.
    Désolé linou de t'avoir induit en erreur.

    Manuxme.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/11/2010, 13h07
  2. [RegExp] Tester l'existence d'une chaine avec les regexp
    Par mustapha_aim dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/07/2010, 10h48
  3. Construire des tableaux a partir d'une chaine avec les RegExp?
    Par Zineb1987_UNI dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/10/2009, 15h10
  4. [RegEx] Sous-chaîne dans une sous-chaîne : optimisation RegExp
    Par mathieugamin dans le forum Langage
    Réponses: 3
    Dernier message: 17/12/2007, 08h44
  5. executer une fonction dans un regexp
    Par mobscene dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2007, 22h44

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