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

C# Discussion :

Regex pour capturer une date


Sujet :

C#

  1. #1
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut Regex pour capturer une date
    Salut les amis,

    Je bloque sur un probleme surement pas tres complique, mais je n'arrive pas a m'en sortir.

    J'ai une date au format "31st December 2017" au milieu d'un texte. Cette date pourrait tout aussi bien etre "22nd December 2017", ou autre variante avec le suffixe nd, th, rd ou encore st. J'essaie de la detecter par regex, mais je ne trouve rien.

    Le probleme se situe apparemment sur la detection "31st". Voici un exemple de code ou j'essaie de detecter le debut de la date :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var text = "xyz abcd 31st December 2015 efgh ijkl";
     
    var pattern2 = "[0|1|2|3][0-9]{1}[th|nd|rd|st]";
    var results = Regex.Matches(text, pattern2);
     
    foreach (Match result in results)
    {
        Console.WriteLine(result.Value);
    }
    Cela me renvoie comme resultat "31s" au lieu de "31st". Bien sur si la date commence par "22nd" ou "23rd" ou "10th" la problematique est la meme. J'ai essaye avec des parentheses, mais rien n'y fait.

    Sauriez-vous comment recuperer ca correctement ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  2. #2
    Membre confirmé Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Points : 461
    Points
    461
    Par défaut
    Bonjour ,

    Le problème se situe au niveau a la fin de ton pattern [th|nd|rd|st]

    Dans un token qui se présente comme ceci [abc] va matcher selon le principe : a single character of: a,b or c.
    Cela explique pourquoi ca match dès le "31s" .

    Ensuite pour la solution j'y travail , ca devrais pas être compliqué.
    throw new NoSignatureException();

  3. #3
    Membre actif
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Septembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 176
    Points : 297
    Points
    297
    Par défaut
    Bonjour,

    Je suis loin d'être un expert mais je pense que cela vient des 'crochets' de ton pattern.
    Un pattern comme celui-ci devrait mieux correspondre à ce que tu attend.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (0|1|2|3)[0-9]{1}(th|nd|rd|st)
    En fait je pense que le OU ne prend en compte qu'une lettre de chaque coté de lui, donc le 's' dans ton exemple.
    Si on décompose le [th|nd|rd|st], on pourrait le lire comme ça [thndrdst], ça reviendrait au même, et donc il recherche, l'une de ces lettres.

    Bonne continuation.
    L’aléatoire n’existe pas en informatique, c’est juste un moyen de dire que l’on a pas encore compris.

  4. #4
    Max
    Max est déconnecté
    Expert éminent sénior

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Points : 14 933
    Points
    14 933
    Par défaut
    Salut.

    En effet, les crochets servent à définir un ensemble de caractères et les parenthèses un groupe (par défaut à capturer).

    Pour faire suite au message de Kyroon (sa regex ne capture pas le deuxième chiffre), le plus simple dans ton cas serait (à condition que tu souhaites tout dans une seule et unique capture) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ([0-3][0-9](?:th|nd|rd|st))
    Explications :

    • (...) : le groupe global à capturer ;
    • [0-3] : un chiffre compris entre 0 et 3 ;
    • [0-9] : un chiffre compris entre 0 et 9 (le {1} ne sert à rien, c'est la valeur par défaut);
    • (?:...) : un sous-groupe, mais qu'on ne capture pas via "l'option" ?: ;
    • th|nd|rd|st : soit th, soit nd, soit rd, soit st.

    Par ailleurs il faudrait voir si tu cherches à "valider" cette date ou pas : cette regex, par exemple, valide 21rd.

  5. #5
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    En effet avec les parentheses autour des OU ca marche mieux

    Ce qui me surprend c'est qu'en langage R, cette regex fonctionne tres bien, mais pas en C#... D'ou mon incomprehension initiale.

    En tout cas merci les gars pour ce coup de pouce
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Bonjour,
    Citation Envoyé par Max Voir le message
    Par ailleurs il faudrait voir si tu cherches à "valider" cette date ou pas : cette regex, par exemple, valide 21rd.
    Tout à fait ! Car en plus des incohérences de suffixes, la Regex laisserait passer tous les 36 du mois
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    J'ai oublie de repondre a cette question. Je ne cherche pas specialement a valider la date.

    Pour vous donner une image un peu plus globale de ce que je fais, je cherche a extraire les dates dans des documents juridiques, qui ont deja ete relus et approuves par differentes personnes. J'utilise differentes regex ignobles qui font 30 km de long, pour capter plein de formats differents (31st December 2015 / 12/31/2015 / 12-31-15, etc.). Les formats sont regroupes de telle sorte a ce que ceux qui sont similiaires soient dans la meme regex. Ensuite, pour chaque format, j'utilise une liste de formats pour la conversion a l'aide de DateTime.TryParseExact. Les dates qui ne peuvent etre converties sont enregistrees et au fur et a mesure on fera evoluer tout ce joyeux bazar...

    En parallele, on regarde du cote des techniques d' "Information extraction" pour utiliser du machine learning a la place de ce genre d'horreur. Ce sera beaucoup plus simple a maintenir, mais on commence tout juste les tests donc a suivre...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

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

Discussions similaires

  1. Formater une cellule en VBA pour recevoir une date
    Par *.Har(d)t dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/05/2007, 17h39
  2. Réponses: 1
    Dernier message: 18/03/2007, 17h52
  3. Comment fait-on pour insérer une date dans un champs DateTime
    Par gibea00 dans le forum Accès aux données
    Réponses: 1
    Dernier message: 14/01/2007, 01h04
  4. [Conception] Additionner le nombre de jours pour donner une date
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/11/2006, 09h03

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