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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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...

+ 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