Partage
  • Partager sur Facebook
  • Partager sur Twitter

Regex pour date

    14 février 2022 à 13:01:03

    Bonjour, 

    je cherche une regex qui me permet d'extraire les dates dans une chaîne de caractères sous la forme "ddmmyyyy" sans espaces ni tirets.

    Je vous remercie d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      14 février 2022 à 14:29:57

      la date apparait comment dans tes chaines de caractères ?
      • Partager sur Facebook
      • Partager sur Twitter
        14 février 2022 à 19:20:39

        Il faudrait savoir le format courant de la date et ce qu'il y a autour.
        Avec sed ça aurait ressemblé à: s/^.*([0-9]{2})[ -/]([0-9]{2}([ -/]([0-9]{4}).*$/\1\2\3/
        Ou peut-être [0-3][0-9] pour les jours, [0-1][0-9] pour les mois, [12][0-9]{3} pour les années.
        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          17 février 2022 à 1:06:07

          Bonsoir,

          En fait, j'ai dans ma bdd plusieurs format de dates de type "ddmmyyyy" ou "dd/mm/yyyy" ou "ddmmyy" et je cherche une regex qui va me permettre de récupérer tous ces formats en même temps et sans prendre en considération les numéros de téléphones et les autres numéros.

          J'espère que j'étais claire.

          • Partager sur Facebook
          • Partager sur Twitter
            17 février 2022 à 1:53:47

            Je veux bien te donner tous les regex que tu veux, encore faut-il que tu puisse les appliquer. :)
            Je connais les regex surtout avec GNU sed ou ceux de Python.
            Si tu as des numéros de téléphones ou d'autres nombres, comment faire la différence?
            Quel est l'intervalle de tes dates (1900+ ou 2000+) ?
            Si je suppose que les dates sont précédées et suivies d'un non-numérique, ça pourrait donner ceci:
            s/^.*[^0-9]([0-3][0-9])\/?([01][0-9])\/?([0-2][0-9]|20[0-2][0-9])[^0-9].*$/\1\2\3/
            On peut raffiner encore, mais j'aimerais savoir si ça te conviendrait.

            Je te donne seulement pour les jours:
            (0[1-9]|[12][0-9]|3[01])
            Ne t'avises pas d'avoir un 31 février. :)

            -
            Edité par PierrotLeFou 17 février 2022 à 2:06:03

            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              17 février 2022 à 2:47:10

              SalmaCha23 a écrit:

              Bonsoir,

              En fait, j'ai dans ma bdd plusieurs format de dates de type "ddmmyyyy" ou "dd/mm/yyyy" ou "ddmmyy" et je cherche une regex qui va me permettre de récupérer tous ces formats en même temps et sans prendre en considération les numéros de téléphones et les autres numéros.

              J'espère que j'étais claire.


              Comme idée : compter le nombre de caractères (8, 10, 6). Quand 10 caractères, y-a-t-il le caractère / ? OUI : c'est pas un numéro de téléphone, l'année est sur 4 caractères (les 4 derniers). Début : 2 caractères DD, donc entre 01 et 31 (au-delà, c'est pas une date). Je pense qu'il faudra parser = lire caractère par caractère et faire le regex selon la suite obtenue.

              -
              Edité par CristianoRolando 17 février 2022 à 2:47:52

              • Partager sur Facebook
              • Partager sur Twitter
                17 février 2022 à 3:24:27

                Si on avait une idée du format général de ses lignes, ça serait déjà un début.

                Un exemple fictif pourrait suffire.
                Est-ce un fichier en format CSV ou autre?

                -
                Edité par PierrotLeFou 17 février 2022 à 3:33:39

                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                  17 février 2022 à 9:13:04

                  Bonjour,

                  Je voulais résumer ta demande. Tu as un champ de type VARCHAR qui contient tout un tas de valeurs différentes. Certains enregistrements contiennent des dates dans des formats différents, et tu voudrais uniquement récupérer ces dates en sortie.

                  C'est bien cela ?

                  Tu as cité les formats :

                  SalmaCha23 a écrit:

                  "ddmmyyyy" ou "dd/mm/yyyy" ou "ddmmyy"

                  Y en a-t-il d'autres ? Si oui lesquels ?

                  En l'état, une regex possible serait :

                  ^([0-9]{2})/?([0-9]{2})/?([0-9]{2,4})$

                  Outre le fait de trouver une REGEX qui matche ces formats, peux-tu envisager de rajouter une colonne de type DATE dans ta table pour y reprendre les bonnes valeurs une fois traitées ?

                  -
                  Edité par Benzouye 17 février 2022 à 9:15:23

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    18 février 2022 à 13:37:40

                    Bonjour,

                    je vous remercie pour vos retours.

                    En fait, j’ai trouvé une regex qui marchait bien pour les dates avec des Slash mais pour le cas où on a pas de Slash (par exemple 18022022) la regex marche en enlevant le slash mais elle prend aussi les autres types de numéros. Ma colonne est un fichier json qui contient du texte ce qui fait que je peux trouver des dates, numéros, code etc.

                    Je vous remercie d’avance.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 février 2022 à 17:43:55

                      Peux-tu me donner un exemple fictif d'une ligne? Et de ton regex?
                      Il faut que le regex soit assez sélectif pour éliminer ce qui n'a pas l'air d'une date.
                      Tu dois avoir exactement 6 ou 10 caractères numériques en plus des règles imposées sur ceux-ci.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le Tout est souvent plus grand que la somme de ses parties.

                        19 février 2022 à 21:06:32

                        Finalement, j'ai réussi à faire une regex qui marche bien mais j'ai pris en compte que les années à partir de 2000.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 février 2022 à 22:09:41

                          Pourquoi poster sur le forum si tu ne partages rien ?

                          Tu ne nous as jamais posté d'exemples, et ne donnes même pas ta solution...

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            20 février 2022 à 14:06:06

                            Rebonjour,

                            C'est pas ça, c'est juste que je n'ai pas vraiment un exemple concret à partager c'est une colonne d'une table de type JSON ou dans chaque ligne on a des commentaires. Par exemple, "Il faut envoyer le colis avant le 22/02/2022", c'est un exemple fictif. C'est des phrases différentes, je l'ai bien précisé avant. Je m'excuse si je n'étais pas claire.

                            Et pour la regex, je suis pas sûre si c'est la bonne façon de faire, je vous  la poste ici : '(0[1-9]|1[1-9]|2[1-9]|3[0-1])(0[1-9]|1[0-2])(200[1-9]|201[1-9]|202[0-2])|(0[1-9]|1[1-9]|2[1-9]|3[0-1])(0[1-9]|1[0-2])(0[1-9]|1[1-9]|2[0-2]$)|(0[1-9]|1[1-9]|2[1-9]|3[0-1])\/(0[1-9]|1[0-2])\/(200[1-9]|201[1-9]|202[0-2])|(0[1-9]|1[1-9]|2[1-9]|3[0-1])\/(0[1-9]|1[0-2])\/(0[1-9]|1[1-9]|2[0-2]$)'

                            Je suis désolée encore une fois si je me suis mal exprimée.

                            Vous me dites ce que vous en pensez.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 février 2022 à 18:41:44

                              Je reprend ta regex et je la découpe:
                              '(0[1-9]|1[1-9]|2[1-9]|3[0-1])
                              Comment je reconnais le 10 et le 20 du mois?
                              Tu peux faire [12][0-9]
                              (0[1-9]|1[0-2])
                              Parfait.
                              (200[1-9]|201[1-9]|202[0-2])
                              Tu ne veux pas de l'an 2000 et 2010?
                              Tu peux faire 20[01][0-9]
                              |(0[1-9]|1[1-9]|2[1-9]|3[0-1])(0[1-9]|1[0-2])(0[1-9]|1[1-9]|2[0-2]$)|(0[1-9]|1[1-9]|2[1-9]|3[0-1])\/(0[1-9]|1[0-2])\/(200[1-9]|201[1-9]|202[0-2])|(0[1-9]|1[1-9]|2[1-9]|3[0-1])\/(0[1-9]|1[0-2])\/(0[1-9]|1[1-9]|2[0-2]$)'
                              Même remarques.
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Le Tout est souvent plus grand que la somme de ses parties.

                                20 février 2022 à 19:19:49

                                En fait, je prend les années de 2000 à 2021. Donc je dis que les années s'écrivent 200+ ( 1-9 pour les années de 2001 à 2009) ou 201+( 1-9 pour les années de 2011 à 2019) ou 2020, 2021, 2022.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  21 février 2022 à 0:56:16

                                  Tiu as  écrit:
                                  > En fait, je prend les années de 2000 à 2021. Donc je dis que les années s'écrivent 200+ ( 1-9 pour les années de 2001 à 2009)
                                  C'est 2000 ou 2001?
                                  Pour 2000, c'est 200[0-9] pas 200[1-9]
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Le Tout est souvent plus grand que la somme de ses parties.

                                    21 février 2022 à 9:49:32

                                    Ta regexp me paraît bien compliquée ...

                                    Si l'on considère l'exemple donné :

                                    SalmaCha23 a écrit:

                                    Il faut envoyer le colis avant le 22/02/2022

                                    La regex suivante devrait suffire :

                                    ([0-9]{2})/?([0-9]{2})/?([0-9]{2,4})$
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                      21 février 2022 à 9:54:56

                                      En fait, cette regex peut prendre des dates invalides comme 45/19 etc. C'est pour cela que j'ai un peu compliqué la regex mais normalement elle contient tous les types de formats de dates (avec ou sans slash).

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        21 février 2022 à 11:19:48

                                        SalmaCha23 a écrit:

                                        cette regex peut prendre des dates invalides comme 45/19

                                        Pas 45/19 mais en effet 45/19/1543 ...

                                        C'est pour cela que je te demandais plus tôt des exemples de données que l'on pouvait trouver dans ta table ...

                                        Dans tous les cas, tu peux simplifier ta REGEX ainsi :

                                        (0[1-9]|1[1-9]|2[1-9]|3[0-1])/?(0[1-9]|1[0-2])/?(20)?(0[1-9]|1[1-9]|2[0-2])$

                                        Elle aura le même effet que ta tartine précédente ;)

                                        -
                                        Edité par Benzouye 21 février 2022 à 11:23:17

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                          21 février 2022 à 12:23:46

                                          D'accord, merci.

                                          Ta regex marche bien mais j'ai enlevé le "$" à la fin vu que la date peut être au milieu de la chaîne de caractères.

                                          J'ai une question, dans le cas où on a deux dates dans la même chaîne de caractères comment peut-on faire pour récupérer les deux dates sur mysql?.

                                          Je vous remercie d'avance

                                          -
                                          Edité par SalmaCha23 21 février 2022 à 12:37:55

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            21 février 2022 à 14:48:02

                                            On ne peut pas ... Il faut passer par une boucle, soit dans un programme tiers soit dans une procédure stockée.

                                            Je te conseille de passer par un programme tiers (PHP, Java, C#, etc.) où tu maîtriseras bien mieux la gestion des REGEX et des boucles.

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                              21 février 2022 à 15:37:10

                                              @Benzouye,
                                              Je ne suis pas tout à fait d'accord avec tes regex, ils me semblent trop simples.
                                              Mais je suis d'accord qu'il faudrait passer par un logiciel tierce qui devra analyser chaque ligne et isoler les pattern numériques.
                                              Une fois les pattern isolés, on peut faire toutes sortes de tests comme vérifier la longueur.
                                              Je ne sais toujours pas quels sont les délimiteurs entre les champs. Si c'est du JSON, peut-être que c'est le guillemet?

                                              En Python, on peut gérer les fichiers JSON. Chaque champs serait une entrée dans un dictionnaire.

                                              Si on connait le nom du champs, ce serait plus facile de l'extraire et de le tester.

                                              -
                                              Edité par PierrotLeFou 21 février 2022 à 15:40:53

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Le Tout est souvent plus grand que la somme de ses parties.

                                              Regex pour date

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown