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.
Le Tout est souvent plus grand que la somme de ses parties.
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.
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
Le Tout est souvent plus grand que la somme de ses parties.
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
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 ?
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.
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.
Le Tout est souvent plus grand que la somme de ses parties.
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.
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.
Le Tout est souvent plus grand que la somme de ses parties.
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.
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]
Le Tout est souvent plus grand que la somme de ses parties.
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).
@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
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.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.