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

C Discussion :

Expression régulière


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 93
    Par défaut Expression régulière
    Bonjour a tous,

    Je suis entrain de faire un lex et un yacc et je cale sur une expression régulière.

    Je veux qu'il me renvoi le mot clé IDF à chaque fois qu'il rencontre

    - n'importe quelle chaine : [a-zA-z0-9]
    - qui peut commencer par <*
    - mais qui ne peut pas commencer par < suivi de lettres (ex : <html )

    En résumé :

    test = IDF
    <* test = IDF
    <html test = PAS IDF

    Est-ce que c'est assez clair ?

    Merci pour votre aide

    Cordialement

  2. #2
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Qu'as-tu déjà fait ?
    Cette expression devrait trouver ce que tu cherches ...

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 93
    Par défaut
    Nan c'est pas ca. Est-ce que l'on ne peut pas remplacer les {} par autre chose ??

    Voila ce que j'avais deja fait :

    ^[^<][a-zA-Z]+[a-zA-Z0-9]+

    dans la premiere partie, je veux dire tout ce qui ne commence pas par < suivi de lettres

    Ou est mon erreur ?

  4. #4
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Le méta-symbole '^' désigne le complémentaire dans une classe de caractères.
    C-à-d que [^abc] reconnait toutes les lettres sauf a,b et c.

    Si tu désires récupérer tout ce qui ne commence pas par '<', il suffit de commencer avec :

    Mais je ne suis pas d'accord avec ton 1ier message, car tu ne reconnaiteras pas "<*blabla" puisque cette chaîne commence par un '<'

    Si ton expression commence par '^', tu ne trouveras que les solutions en début de ligne.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 93
    Par défaut
    Citation Envoyé par je®ome Voir le message
    Le méta-symbole '^' désigne le complémentaire dans une classe de caractères.
    C-à-d que [^abc] reconnait toutes les lettres sauf a,b et c.

    Si tu désires récupérer tout ce qui ne commence pas par '<', il suffit de commencer avec :

    Mais je ne suis pas d'accord avec ton 1ier message, car tu ne reconnaiteras pas "<*blabla" puisque cette chaîne commence par un '<'

    Si ton expression commence par '^', tu ne trouveras que les solutions en début de ligne.
    Oui voila justement le problème. C'est que si je met : ^<, il ne reconnait pas <*.

    Donc moi ce que j'aimerais écrire, c'est ce qui commence par < suivi de lettre comme par exemple <html> <toto... mais qui reconnaisse quand meme <*

    Je ne vois pas comment écrire cela

  6. #6
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Tu peux faire en sorte que < ne soit reconnu que quand il est suivi de * de la manière suivante :

    Ainsi il reconnait < uniquement s'il est suivi de *

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 93
    Par défaut
    Citation Envoyé par je®ome Voir le message
    Tu peux faire en sorte que < ne soit reconnu que quand il est suivi de * de la manière suivante :

    Ainsi il reconnait < uniquement s'il est suivi de *
    Donc la jai mis :

    idf ^<\*[:alnum:]*

    mais ca ne fai pas ce que je veux :

    si j'écri : <* test *>

    ca me met : BO test BF au lieu de BO IDF BF

    On y est presque je pense

  8. #8
    Membre chevronné Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Par défaut
    J'aurais plutot mis [<\*] pour protéger le caractère *. Encore que je ne suis pas sur que ca fasse ce que tu veux. Cette expression veut dire: caractere "<" ou caractere "*". Il te faudrait plutot quelque chose du genre ^<\* pour trouver une chaine qui commence par <*

    croisement... Pour ton probleme il faudrait qu'on sache un peu mieux comment marche ton parseur en dehors de la problématique de trouver la bonne expression reguliere.

  9. #9
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Citation Envoyé par psgkiki Voir le message
    Donc la jai mis :

    idf ^<\*[:alnum:]*

    mais ca ne fai pas ce que je veux :

    si j'écri : <* test *>

    ca me met : BO test BF au lieu de BO IDF BF

    On y est presque je pense
    Ce n'est pas ce que j'ai mis. '\' n'est pas égal à '/'

    Citation Envoyé par KindPlayer Voir le message
    J'aurais plutot mis [<\*] pour protéger le caractère *. Encore que je ne suis pas sur que ca fasse ce que tu veux. Cette expression veut dire: caractere "<" ou caractere "*". Il te faudrait plutot quelque chose du genre ^<\* pour trouver une chaine qui commence par <*
    Pas besoin de protéger le méta symbole *, car il n'est pas actif dans une classe de caractères. Tu trouves * avec[*]

    Il ne faut pas confondre |,\ et / !!!!!
    Un \ transforme une méta symbole en un simple symbole.
    / définit un contexte sensitif à droite. p.ex.: a/b on reconnait a qd il est suivi de b
    a|b définit soit a, soit b

  10. #10
    Membre chevronné Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Par défaut autant pour moi
    je ne connaissais pas le caractere "/" ( du coup j'ai mal interprété ton expression [</*] ). C'est spécifique à C ou est ce général à tout type d'expression régulière?

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 93
    Par défaut
    Rien à faire, ca ne marche toujours pas.

    Voici le début de mon lex :

    Code : 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
    22
    23
    24
    25
    26
    27
    28
    %{
    #include <stdio.h>
    #include <string.h>
    #include "cd.tab.h"
    int numligne = 0;
    char *p, *q;
    %}
    
    %s JHP
    blanc [ \t]+
    idf [</*][ a-zA-Z0-9 ]*
    qstring \"[a-zA-Z0-9\/.-]*[\"\n]
    commentaire \/\*(([^*])|(\*[^/]))*\*\/
    img "repertoire_image"
    
    %%
    {blanc} {ECHO;}
    {commentaire} {ECHO;}
    \n {printf("\n");numligne++;}
    <JHP>{img} {printf("IMG ");}
    "<*" {printf("JHP ");BEGIN(JHP);}
    "*>" {printf("FJHP ");BEGIN(0);}
    {idf} {printf("IDF ");
    			p=(char *)calloc(strlen(yytext)+1,sizeof(char));
                            strcpy(p,yytext);
                            yylval.string=p;
    			}
    ...
    Ensuite, j'ai bien mon exécutable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    julien@julien-desktop:~/Documents/test3$ ./toto
     
    <* test *>
    BO  test BF 
    test
    test
    <html>
    IDF >
    Cela me renvoie :

    - BO test BF au lieu de BO IDF BF
    - test au lieu de IDF
    - IDF > au lieu de <html>

    donc en gros ce que je veux, c'est qu'il me renvoi IDF quand ca commence par <* ou par rien et qu'il me renvoie pas IDF quand ca commence par <html> par exemple.

    Cordialement

    (vous voulez un extrait du yacc aussi ?)

  12. #12
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idf [</*][ a-zA-Z0-9 ]*
    Commencons par enlever les espaces.


  13. #13
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 93
    Par défaut
    C'est fait mais pas de changements.

    Ralala, je galere à la trouver cette expression régulière.

    Je veux : tous les mots qui ne commencent pas par <texte (exemple:<html>) mais qui commencent par <* (exemple : <* test) ou une chaine (exemple : test).

    J'ai besoin de votre aide

    Pour l'instant, j'ai cela : ^[^"</alphanum"|"</*"][a-zA-Z0-9]+

Discussions similaires

  1. [RegEx] Expression régulières : Balises <SCRIPT>
    Par Gwipi dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2006, 23h25
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 18h17
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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