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

Langages de programmation Discussion :

Regex: obligation de présence d'un/de caractère(s)


Sujet :

Langages de programmation

  1. #1
    Membre éprouvé
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2005
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 366
    Points : 1 032
    Points
    1 032
    Par défaut Regex: obligation de présence d'un/de caractère(s)
    Bonjour,

    Je réalise une regex pour un petit framework db.
    Pour écrire la condition where j'ai écrit ceci en regex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?<table_name>\w+:)?(?<column_name>\w+)(?<operator><?>?=?%?)
    Le groupe operator laisse donc un choix parmi
    Le hic, c'est que j'aimerais bien indiqué une obligation de présence de cet opérateur.

    J'ai fait une liste de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    a<>
    a%
    a<
    a>
    a<=
    a>=
    a=
    a==
    a%=
    a=<
    a
    Le dernier ne comporte pas d'opérateur et match quant même.

    Donc, comment faire pour rendre la présence d'au moins un élément du groupe operator obligatoire et aussi interdire des choses comme <>= qui sont aussi valides.

  2. #2
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    420
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 420
    Points : 833
    Points
    833
    Par défaut
    Citation Envoyé par xarkam Voir le message
    Bonjour,

    Je réalise une regex pour un petit framework db.
    Pour écrire la condition where j'ai écrit ceci en regex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?<table_name>\w+:)?(?<column_name>\w+)(?<operator><?>?=?%?)
    C'est en quel langage (il y a parfois quelques différences)
    Normalement, ? signifie 0 ou 1 occurrence du motif précédent.
    Si il doit y en avoir un et un seul, il n'y a pas besoin de ?
    Si il doit y en avoir un ou plus, c'est le "+" qui doit être utilisé.

  3. #3
    Membre éprouvé
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2005
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 366
    Points : 1 032
    Points
    1 032
    Par défaut
    C'est destiné au C#, mais je réalise la regex avec expresso.
    Je met des ? car je peut avoir des <= ou >= mais je ne peut pas avoir du =% ou du %< ou %>

    En fait je ne peut pas définir une condition WHERE sans opérateur.
    WHERE column_name ORDER ne donne pas une sql correcte.

    En C# si je lui dit de matcher les groupes, il prendra en compte un groupe sans opérateur et créera une mauvaise requête.

    A la base j'avais fait (<?>?)?=|% mais je ne matchais pas sur le %

  4. #4
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    420
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 420
    Points : 833
    Points
    833
    Par défaut
    J'aurais tendance à faire un truc du genre
    [><=]?=|<>|%

  5. #5
    Membre éprouvé
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2005
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 366
    Points : 1 032
    Points
    1 032
    Par défaut
    Je vais tester ca dans expresso.

    Edit: j'ai testé et ton code laisse juste passer ==
    Mais c'est pas mal déjà.

  6. #6
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    420
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 420
    Points : 833
    Points
    833
    Par défaut
    Citation Envoyé par xarkam Voir le message
    Je vais tester ca dans expresso.

    Edit: j'ai testé et ton code laisse juste passer ==
    Mais c'est pas mal déjà.
    Ben oui, il laisse passer == parce qu'il m'a semblé être dans ta liste...
    [><]?=|<>|%
    ne le laissera pas passer :-)

  7. #7
    Membre éprouvé
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2005
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 366
    Points : 1 032
    Points
    1 032
    Par défaut
    Salut,

    Sous cette format ca match: <>|%|[><]?=?

    Si tu sais m'expliquer pour quelle raison je suis obligé de mettre <>|%| en début d'expression.

    Merci.

    Edit: ca match si on ne met rien.
    Je veux faire a= mais si je met juste a, il match alors qu'il ne devrait pas.

  8. #8
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    420
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 420
    Points : 833
    Points
    833
    Par défaut
    En fait, si, c'est normal que ça matche :
    <>|%|[><]?=?
    Signifie
    "<>" OU "%" OU (0 ou 1 fois un des caractères de la liste "><" suivi de 0 ou 1 signe "=")
    Donc a matche la dernière partie de ton expression.
    Sinon, je ne vois pas de différence entre
    <>|%|[><]?=
    et
    [><]?=|<>|%
    D'ailleurs, en relisant tes expressions, je dirais plutôt
    [<>=%]|[><%]=|<>
    Il y a peut-être plus optimisé mais au moins, ça devrait marcher.
    on a :
    Un parmi "<, >, =, %"
    ou
    Un parmi "<, >, %" suivi de =
    ou
    <>

  9. #9
    Membre éprouvé
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2005
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 366
    Points : 1 032
    Points
    1 032
    Par défaut
    Salut,
    C'est pas encore ca ^^
    Je vais te donner le bout de regex.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?<table_name>\w+:)?(?<column_name>\w+)(?<operator><>|[><%]=|[<>=%])(?<right_part>(?<table_name>\w+:)?(?<column_name>\w))?
    Voila ceci est la partie WHERE de ma regex.

    En général je vais donner une colonne et un opérateur sans la partie droite.
    La partie droite sera injectée à la volée avec des valeurs issues de formulaires. Mais je prévois de faire du where avec une partie droite correspondant à une colonne.

    J'ai donc testé ton code après modification car l'ordre est important pour le matching et le seul qui ne passe pas est a%=

    Lui est matché complètement alors qu'il ne devrait prendre que le = dans =%

    EDIT: en modifiant [><%]= en [><]= ca semble matcher correctement. Je vais faire les TU.

Discussions similaires

  1. [PowerShell] Regex - Probleme saut de ligne remplacement de caractère
    Par lucas057 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 04/12/2014, 15h25
  2. Réponses: 4
    Dernier message: 31/08/2010, 18h45
  3. Réponses: 0
    Dernier message: 06/02/2010, 09h13
  4. [Regex] Récupérer une chaîne qui suit un caractère spécial
    Par dev197 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 30/09/2009, 13h01
  5. [VS.net] Vérifier le présence d'un caractère dans une chaine
    Par arnolem dans le forum Windows Forms
    Réponses: 15
    Dernier message: 10/09/2005, 16h19

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