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

VB.NET Discussion :

Validation d'une chaine par Regex sous vb.net


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Par défaut Validation d'une chaine par Regex sous vb.net
    Bonjour,

    Je débute avec les Regex et mes neurones commencent à fumer sur un cas qui ne devrait pourtant pas être compliqué...

    Je dois valider à la saisie une chaine de caractère qui doit remplir les conditions suivantes :
    - le 1er caractère doit être une majuscule ou un chiffre : ^[A-Z0-9]
    - à part les minuscules, les majuscules et les chiffres, seuls les caractères suivants peuvent être acceptés : "espace", "_" et "-" : [a-z0-9\_\-\ ]+
    - tout caractère précédé d'un espace, d'un "_" ou d'un "-" doit être une majuscule ou un chiffre : (?\ \_\-)[A-Z0-9]
    - le dernier caractère doit être une minuscule, une majuscule ou un chiffre : [a-zA-Z0-9]$

    Quand j'assemble tout ça dans le Regex suivant :
    ^[A-Z0-9][a-z0-9\_\-\ ]+(?\ )[A-Z0-9]+[a-zA-Z0-9]$
    j'ai un beau plantage "syntax error" au moment où je focus sur la textbox (avant même que je ne saisisse un caractère) :

    En option (pas encore traité) :
    - si un mot ou une lettre isolée appartient à une série de mots prédéfinis, alors le mot ou la lettre isolée doit être en minuscules ou chiffres...

    Je m'arrache les cheveux (les derniers ) depuis deux jours sur ce de problème !

    Une bonne âme (ou plusieurs) pour m'aider ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Les regex sont on super outil, mais arrivé à un certain point, il faut savoir admettre que ce n'est pas toujours le plus adapté... Il est peut-être possible faire ce que tu veux avec des regex, mais à moins d'être un super gourou des regex, ça risque d'être beaucoup plus compliqué que de l'implémenter manuellement, et pas forcément plus performant.

    Perso, quand une regex me demande plus de 10 minutes de mise au point, je change d'approche...

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim modele As String = "^[A-Z0-9]{1}[a-zA-Z0-9]*([ -_]{1}[A-Z0-9]{1}[a-zA-Z0-9]*)*$"
    Sans oublier que la vérification doit se faire une fois la saisie complète, donc dans le Validating par exemple, du TextBox concerné.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Par défaut
    Bonjour à tous les deux (tomlev et chrismonoye),

    Merci pour vos réponses.

    @ tomlev : En fait, je n'ai pas le choix, je dois utiliser un Regex pour interdire la saisie de caractères non conformes par l'utilisateur.

    @ chrismonoye : merci pour ta correction : je vais tester. Par contre, je dois contrôler la saisie de l'utilisateur en temps réel (j'utilise le regex dans le mask). pas possible d'attendre le Validating (provoqué par un changement de focus sur un autre contrôle).

    Je teste et je reviens...

  5. #5
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par Lamanne Voir le message
    Par contre, je dois contrôler la saisie de l'utilisateur en temps réel (j'utilise le regex dans le mask). pas possible d'attendre le Validating (provoqué par un changement de focus sur un autre contrôle)
    Je suis très loin d'être un pro des regex (j'ai du utiliser ce machin une fois ou deux) mais ce passage me semble étrange...

    Si tu contrôles cela "en temps réel" (pour reprendre tes termes), la regex ne sera forcément pas valide...

    Bête exemple :
    Soit un Textbox dans lequel l'utilisateur doit encoder un code postal. En Belgique, les codes postaux sont composés de 4 chiffres.
    Si je contrôle en cours de frappe, pour les 3 premiers caractères, cela sera d'office faux puisque la regex exigera 4 caractères numériques. Bref, je pense que cela doit se faire lors du Validating.

    Maintenant je le répète, je ne suis pas pro des regex (et du .NET non plus d'ailleurs)

    Griftou.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Par défaut
    En fait, la chaine est valide de 0 à 50 caractères.
    Le mask est un "editmask" sur un contrôle "textedit" de Devexpress.

    Il s'agit de forcer la saisie en "proper case" (première lettre de chaque mot en majuscule ou chiffre, les autres en minuscules ou chiffres) + autoriser "espace", "_" et "-" et rien d'autre.
    Exceptions : les mots comme "et", "ou", "à",... doivent être entrés tout en minuscules.

    Ca marche très bien pour :
    - pas de "case" : regex : [a-zA-Z0-9\_\ \-]{0,50}
    - "upper case" : regex : [A-Z0-9\_\ \-]{0,50}
    - "lower case" : regex : [a-z0-9\_\ \-]{0,50}
    - "proper case" : regex : ^[A-Z0-9]{1}[a-zA-Z0-9]*([ -_]{1}[A-Z0-9]{1}[a-zA-Z0-9]*)*$

    @ chrismonoye : ton regex fonctionne presque parfaitement mais 2 pbs quand même :

    • j'ai un "^" qui se place automatiquement devant le premier caractère de la châine si la chaîne est remplie par le code
    • si la chaîne est initialement vide, je ne peux pas saisir de caractère au clavier : rien ne passe, ni en minuscule, ni en majuscule.... suaf si je saisis un "^" devant.

    Autre question : dans ta regex, tu n'autorises pas explicitement les caractères "espace", "_" et "-". Pourtant, je peux les saisir ???

    La bonne nouvelle c'est que je n'ai plus de plantage !

    Si vous avez une idée...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Par défaut
    Retesté en enlevant le "^" au début de la regex :

    [A-Z0-9][a-z0-9\_\-\ ]+(?\ )[A-Z0-9]+[a-zA-Z0-9]$

    Plus de pb de "^" intempestif, même si la regex n'est plus tout à fait académique.Mais j'ai toujours un problème de validation.

    Si un cador des regex pouvait m'aider, ce serait super sympa !

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonsoir,
    j'ai jeté un regard sur le contrôle TextEdit de DevEpress.
    Ils n'ont intégré les expressions régulières que partiellement ou les ont adaptées à leur sauce, si je comprends bien cette discussion.
    In fact, the Full-functional regular expressions used in our editors insignificantly differ from the standard ones. So, for instance, we do not support the "lookahead", "lookbehind" constructs and start of string and end of string anchors.

    Please review the Mask Type: Full Functional Regular Expressions help article to learn how to build regular expressions to use them in our editors.
    Alors tu dois faire avec.
    Pour ton soucis de validation, peut être le tiret sous le 6, il doit être placé en premier ou en dernier dans ton groupe de caractères, sinon il indique une plage entre les deux caractères qui l'entourent.
    Normalement en Regex standard, tu n'as pas à échapper tes 3 derniers caractères (avec l'anti-slash), ce ne sont pas des opérateurs.

  9. #9
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonsoir,

    Personnellement je trouve ça bien complexe pour pas grand chose, une vérification que tous les caractères sont dans l'ensemble choisi (faisable via regex, ou un Linq All(Contains))
    et après pour le formattage une vérification que le texte est égal au texte renvoyé par TextInfo.ToTitleCase (qui semble correspondre à la définition donnée de "proper case")

    Pour la validation temps réel, suffit de passer par un TextChanged, après je ne connais pas ce contrôle (même si j'ai pu voir qu'il possédait cet évènement)

    Cordialement !

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Par défaut
    Bonsoir et merci pour votre aide.

    @ chrismonoye : je n'avais pas vu qu'ils ne supportent pas le lookahead et le lookbehind. Pourtant, avec la regex que tu m'as donnée, le lookahead fonctionne bien puisqu'après un "espace", un "_" ou un "-", si je tape une minuscule elle est bien transformée automatiquement en majuscule.

    @ Sehnsucht : en fait, j'aimerais bien me passer des regex : j'ai une fonction qui fonctionne très bien sur un textbox standard. le pb c'est qu'il s'agit d'une "textedit" utilisée comme "in place editor" dans une cellule d'une "vertical grid".
    Lorsque j'essaie d'utiliser cette fonction, j'ai un problème :
    - lorsque cette fonction remplace la chaine tapée par la chaine corrigée dans la textedit, je perds la position du curseur et la textedit ne possède pas de propriété du type "caretindex" ou "selstart/sellength". Donc l'utilisateur doit repositionner le curseur manuellement après la saisie de chaque caractère : innaceptable.

    C'est pour ça que je dois utiliser une regex.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Par défaut
    Bonjour à tous

    Un grand merci à chrismonoye qui a trouvé la solution : dans la discussion que tu as mentionné, il est indiqué que les caractères de début et de fin d'une regex ne doivent pas être inclus pour les controles de Devexpress.

    Et c'était bien là qu'était le problème. le "^" du début et le "$" de fin ne doivent pas figurer dans la regex. En fait je pense qu'ils les ajoutent d'office dans la compilation.

    Pour info, le "lookahead" fonctionne bien, contrairement à ce qu'ils disent...

    Tout fonctionne bien maintenant avec la regex suivante :
    [A-Z0-9][a-z0-9\_\-\ ]+(?\ )[A-Z0-9]+[a-zA-Z0-9]
    à un détail près : lors de la saisie, je ne peux pas interdire la saisie d'un "espace", d'un "_" et d'un "-" comme dernier caractère de chaîne par la regex, sinon l'utilisateur ne peut plus saisir ces caractères entre les mots.

    Je vais donc devoir émettre un message d'erreur si la chaine se termine par l'un de ces 3 caractères lors de la validation.

    Merci à tous pour votre aide !

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

Discussions similaires

  1. Regex pour remplacer une chaine par un lien
    Par lerorodu51 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/03/2014, 15h52
  2. [regex] validation d'une chaine de caracteres
    Par stephane13100 dans le forum C
    Réponses: 4
    Dernier message: 22/08/2011, 21h20
  3. [Système] Remplacer une chaine par un lien hypertexte
    Par Bisûnûrs dans le forum Langage
    Réponses: 10
    Dernier message: 06/06/2007, 09h34
  4. Réponses: 3
    Dernier message: 13/01/2007, 14h05
  5. [Property] Comment déclarer une chaine par defaut ?
    Par Clorish dans le forum Composants VCL
    Réponses: 8
    Dernier message: 07/09/2004, 22h11

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