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

Langage Java Discussion :

[REGEX] Expression validée à tort


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut [REGEX] Expression validée à tort
    Bonjour,

    Je souhaite, pour une chaine de caractères donnée, regarder si elle contient une ou plusieurs dates. Exemple : "blabla12071998blabla23-09-2013blabla".

    J'ai donc une expression régulière permettant de matcher les différents formats de date suivants :

    ddMMyyyy
    dd MM yyyy
    dd.MM.yyyy
    dd-MM-yyyy
    dd_MM_yyyy


    Le problème que je rencontre est que lorsque ma chaîne de caractères contient une date au format dd/MM/yyyy, elle est matchée alors que je n'indique pas de gérer les dates avec des slashs dans ma regex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final String DATE_REGEX = "(0[1-9]|[12][0-9]|3[01])(-|.|_|\\s)?(01|02|03|04|05|06|07|08|09|10|11|12)(-|.|_|\\s)?(18|19|20|21)\\d{2,4}";
    Quelqu'un peut-il m'expliquer pourquoi ?

    Merci d'avance

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Le . a un sens précis en regex. Si tu veux juste dire "et là il faut un point," tu dois l'échapper, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "[0-9]{2}\\.[0-9]{2}\\.[0-9]{4}"
    J'ajoute que tout ce jonglage avec des chiffres ne mène à rien. Ça t'empêchera pas de tomber sur un 30 Février de toute façon.
    Il faut se contenter de reconnaître "deux chiffres, suivis de deux chiffres, suivi de quatre chiffres," et vérifier ensuite si ça forme une date cohérente. Vérification sans regex, bien sûr.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Merci thelvin, c'était effectivement le point non échappé qui provoquait le problème. Voici la regex corrigée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static final String DATE_REGEX = "(0[1-9]|[12][0-9]|3[01])(-|\\.|_|\\s)?(01|02|03|04|05|06|07|08|09|10|11|12)(-|\\.|_|\\s)?(18|19|20|21)\\d{2,4}";
    Pour les reste, je ne m'attarderais pas à t'expliquer les raisons de mes choix c'est hors-sujet.

    Problème résolu, bonne journée

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    +1 avec @thelvin



    Sinon je rajouterais juste une remarque vis à vis de la regexp initiale.

    Étant donnée qu'elle gère plusieurs types de séparateur, il y a un autre effet de bord indésirable, c'est qu'une chaine comme "23-09.2013" est validée !
    En effet les deux groupes de séparateurs ne sont pas lié, et ils peuvent donc avoir des valeurs différentes.

    On peut utiliser une "back reference" pour palier à cela.
    Je t'invite également à découper ta regexp et à la commenter... pour le jour où tu devras la modifier
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	public static final String DATE_REGEX =
    		"[0-9]{2}" +		// Jour de l'année (format dd)
    		"([-\\._\\s]?)" +	// Un séparateur optionnel : -, ., _, un blanc (groupe 1)
    		"[0-9]{2}" +		// Mois de l'année (format MM)
    		"\\1" +				// Un séparateur (référence au groupe 1)
    		"[0-9]{4}";			// Année (format yyyy)
    a++

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

Discussions similaires

  1. Expression regex pour valider numéro téléphone en France
    Par lordrt dans le forum Général Java
    Réponses: 11
    Dernier message: 15/12/2013, 07h51
  2. regex : expression valide ?
    Par boboss123 dans le forum C
    Réponses: 6
    Dernier message: 05/05/2011, 21h43
  3. [REGEX]Expression régulière
    Par tomca dans le forum Langage
    Réponses: 2
    Dernier message: 10/10/2005, 11h01
  4. [Regex] Expressions régulières: sous groupe
    Par debdev dans le forum Collection et Stream
    Réponses: 12
    Dernier message: 07/07/2005, 14h10
  5. [RegEx]Expression régulière
    Par Sniper37 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 07/06/2005, 11h18

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