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

Framework .NET Discussion :

[Regex] Comment gérer les parenthèses ?


Sujet :

Framework .NET

  1. #1
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut [Regex] Comment gérer les parenthèses ?
    Je suis en train d'écrire un petit programme (en fait un interprêteur) et pour ce faire, j'ai besoin de détecter facilement si un string est valide dans ce langage.

    Voici le langage en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X = [a-z0-9]
    L = lambda X ° U
    U = (U)U
    Aucun problème avec X et L.

    Ce n'est pas le cas de U.
    (f)x avec f et x appartenant à X ne pose aucun problème.

    En effet, si j'utilise cette expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^\s*\(\s*(?<u>.+)\s*\)(?<v>.+)\s*
    alors je me retrouve avec le problème suivant :
    (f)(f)x devient f)(f et x.
    Et évidemment f)(f est illégal dans ce langage.

    Si j'utilise cette expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^\s*\(\s*(?<u>.+?)\s*\)(?<v>.+)\s*
    alors je me retrouve avec :
    ((f)f)x qui devient (f et f)x qui sont tous les deux illégaux.

    Bref, existe-il un moyen efficace en utilisant une expression régulière de résoudre de problème ou bien ferais-je mieux de scanner les caractères un à un en comptant les parenthèses ouvrantes/fermantes ?

  2. #2
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Hum je suis pas sur de saisir à 100%, c'est quoi le format exact que tu veux donner à ton expression?

  3. #3
    Membre éclairé Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Points : 774
    Points
    774
    Par défaut
    il existe un moyen c'est sur:
    pour ta solution precise je ne sais pas pas trop chercher mais regarde ici ca pourra peut etre t'aider:

    http://lgmorand.developpez.com/dotnet/regex/

    ou encore ce site qui comporte pas mal d'expressions ou tu pourra peut-etre trouver ton bonheur:

    http://regexlib.com/Search.aspx

  4. #4
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Citation Envoyé par vdumont
    Hum je suis pas sur de saisir à 100%, c'est quoi le format exact que tu veux donner à ton expression?
    En fait, mon expression doit être de la forme X, L ou U ; sachant que :
    • X doit être de la forme [a-z0-9]+, donc une chaine de caractères alphanumériques en minuscule (en supprimant les espaces).
    • L doit être de la forme lambda X ° U, donc le mot lambda suivi d'une expression de forme X, suivi du caractère °, suivi d'une expression de forme U.
    • U doit être de la forme X, L ou (U)U, donc une expression de forme X ou L ou bien deux expressions de forme U dont la première est entre parenthèses.


    En définitive, je me retrouve face à une expression régulière récursive, si tu veux.

    Quelques exemples faisant partie du langage :
    [*]toto87[*]lambda pouet°couic[*](toto)tati[*]((toto)tati)(pouet)couic[*]lambda f ° lambda x ° (f)x[*]lambda m ° lambda f ° lambda x ° (f)((m)f)x[*](lambda m ° lambda f ° lambda x ° (f)((m)f)x)lambda f ° lambda x ° (f)x
    Quelques exemples illégaux :
    [*]toto°tati[*]pouet(truc)[*](f(f)x)x[*]f)(x
    Merci pour les liens, je vais regarder s'ils m'aident

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    les expressions régulières ont leurs limites et l'annalyse syntaxique en fait partie

    Pourquoi tu n'utilise pas une machine à état ?

  6. #6
    Membre éclairé Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Points : 774
    Points
    774
    Par défaut
    +1 pour gege effectivement les etats semblent plus appropries , il y a pas mal d'example sous yacc.

  7. #7
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Ouaip, je m'en suis rendu compte... Par contre....

    Je vous conseille d'aller lire ceci, je vous assure que ça vaut le coût (d'autant que c'est gratuit :p).

  8. #8
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    J'ai résolu mon problème. Comme c'est quelque chose d'assez nouveau et tout de même très intéressant, je vous fait profiter des résultats (j'ai remplacé "\(" et "\)" par "<" et ">" pour simplifier la lecture de l'expression) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ^
    (
    	(?<o><)
    	(
    		[a-z0-9]+
    		(?<c-o>>)
    	)+
    )+
    [a-z0-9]+
    (?(o)(?!))
    $

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

Discussions similaires

  1. [RegEx] Comment gérer les caractères d'échappement ?
    Par fedfil dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 07/06/2007, 13h30
  2. Réponses: 2
    Dernier message: 08/07/2005, 10h40
  3. [C#/SQL] Comment gérer les exceptions d'une Procédure stockée ?
    Par thomas_strass dans le forum Accès aux données
    Réponses: 10
    Dernier message: 06/07/2005, 10h40
  4. Comment gérer les valeur Nulles dans une requête ?
    Par sondo dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h02
  5. Comment gérer les espaces blancs?
    Par Lambo dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 16/05/2003, 09h44

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