J'ai besoin de valider une chaîne de date pour le format dd/mm/yyyy
avec une expression régulière.
Cette expression régulière valide dd/mm/yyyy
, mais pas les dates invalides telles que 31/02/4500
:
^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$
Qu'est-ce qu'une expression régulière valide pour valider le dd/mm/yyyy
format avec le support des années bissextiles?
pattern
qui prend une expression régulière, et les navigateurs valident automatiquement par rapport à l'expression régulière sans utiliser du tout de JavaScript. Juste en définissant une regex dans l'attribut pattern!Réponses:
La regex que vous avez collée ne valide pas correctement les années bissextiles, mais il y en a une qui le fait dans le même message . Je l'ai modifié pour prendre
dd/mm/yyyy
,dd-mm-yyyy
oudd.mm.yyyy
.^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$
Je l'ai testé un peu dans le lien fourni par Arun dans sa réponse et aussi ici et cela semble fonctionner.
Modifier le 14 février 2019: j'ai supprimé une virgule qui était dans l'expression régulière qui permettait des dates comme
29-0,-11
la source
DD/MM/YYYY
cela, cette expression régulière accepte égalementDD/MM/YY
ce que je ne suis pas sûr que ce soit dans l'intention initiale de l'affiche. Si vous ne souhaitez pas prendre en charge «YY», supprimez tous les?
quantificateurs facultatifs .0?
par0
, et supprime également la dernière occurrence de?
.?
qui devraient être supprimés: remplacez tout(?:1[6-9]|[2-9]\d)?
par(?:1[6-9]|[2-9]\d)
.J'ai étendu le regex donné par @Ofir Luzon pour les formats jj-mmm-AAAA, jj / mmm / AAAA, jj.mmm.YYYY selon mes besoins. Toute autre personne ayant la même exigence peut le référer
et testé pour certains cas de test ici http://regexr.com/39tr1 .
Pour une meilleure compréhension de cette expression régulière, reportez-vous à cette image:
la source
8888
est une année possible. J'espère vivre jusqu'à cet âge.Remarquer:
Donc ça ne fonctionne correctement que pour [1901 - 2099] (Ouf) 😊
jj / MM / aaaa:
Vérifie si l'année bissextile. Les années 1900 à 9999 sont valables. Seulement jj / MM / aaaa
la source
29/02/2100
n'existe pas (2100 n'est PAS une année bissextile), mais est toujours acceptée par le modèle donné.essaye ça.
vous pouvez tester l'expression régulière à http://www.regular-expressions.info/javascriptexample.html facilement.
la source
30-02-2001
... en tout cas merci pour la réponse :)Je soupçonne que ce qui suit est aussi précis que possible sans savoir quand les paramètres régionaux de l'utilisateur sont passés des calendriers julien aux calendriers grégoriens.
Il accepte soit «-», «/», ou rien comme séparateurs entre l'année, le mois et le jour, quel que soit l'ordre.
MMddyyyy:
jjMMaaaa:
aaaaMMjj:
Autre que l'ordre, ceux-ci sont tous fidèles au calendrier julien (année bissextile tous les quatre ans) jusqu'en 1700, lorsque le calendrier grégorien diverge du calendrier julien. Il a deux problèmes:
Cela a été testé par rapport à la mise en œuvre du calendrier de Java de l'année 0001 à l'année 9999, le seul écart étant les 10 jours susmentionnés en 1582.
la source
^([0-9]{4}[-/]?((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048])00)[-/]?02[-/]?29)$
. Testé avec python: repl.it/repls/DependentBestChaptersPour ceux qui les regardent et sont complètement confus, voici un extrait de mon script. Malheureusement, tout ce qu'il fait est de faire correspondre des nombres valides dans une entrée de date et d'heure, et le 31 février sera marqué comme valide, mais comme beaucoup l'ont dit, regex n'est vraiment pas le meilleur outil pour faire ce test.
Pour faire correspondre une date au format 'aaaa-MM-jj hh: mm' (Ou bien dans l'ordre de votre choix)
Le script ci-dessus commence par créer un objet regex. Il trouve ensuite toutes les entrées dont les identifiants correspondent à un certain modèle, puis les boucle. Je ne teste pas la première entrée que je trouve (
if (e > 0)
).Un peu d'explication:
^
signifie le début du match, alors que$
signifie la fin du match.\d+
signifie correspondre à une séquence entière ou contiguë d'entiers, doncmyhtml_element_with_id_56_datetime
etmyhtml_element_with_id_2_datetime
correspondra, maismyhtml_element_with_id_5a_datetime
ne sera pasla source
Voici une autre version de regex pour correspondre à l'un des formats de date suivants et autoriser l'omission des zéros non significatifs:
Regex:
^[0-3]?[0-9].[0-3]?[0-9].(?:[0-9]{2})?[0-9]{2}$
Allumettes:
1/1/11 or 1.1.11 or 1-1-11 : true 01/01/11 or 01.01.11 or 01-01-11 : true 01/01/2011 or 01.01.2011 or 01-01-2011 : true 01/1/2011 or 01.1.2011 or 01-1-2011 : true 1/11/2011 or 1.11.2011 or 1-11-2011 : true 1/11/11 or 1.11.11 or 1-11-11 : true 11/1/11 or 11.1.11 or 11-1-11 : true
Démo Debuggex
la source
13/13/2000
= Correspondances est vraiIci, j'en ai écrit un pour
dd/mm/yyyy
lequel le séparateur peut être un de l'-.,/
année0000-9999
.Il traite des années bissextiles et est conçu pour les saveurs regex, qui prennent en charge les lookaheads, la capture de groupes et les références arrière. NON valable pour tels que
d/m/yyyy
. Si nécessaire, ajoutez des séparateurs supplémentaires[-.,/]
Test à regex101 ; en tant que chaîne Java:
expliqué:
Voir également la FAQ SO Regex ; S'il vous plaît laissez-moi savoir, si cela échoue.
la source
J'ai trouvé ce reg ex ici
Cela valide
mm/dd/yyyy
correctement le format et les dates valides (mais pasm/d/yyyy
).Quelques tests
la source
validera toute date entre
1900-2099
la source
L'expression suivante est agréable et facile à manipuler:
Il valide selon le format MM / jj / AAAA et permet le support des années bissextiles de 1960 à 2016. Si vous avez besoin du support des années bissextiles étendu, il vous suffit de manipuler cette partie de l'expression:
J'espère que cela vous a beaucoup aidé
la source
Une autre réponse qui valide le jour (jj) en fonction du mois (mm) et de l'année (aaaa) (ie, valide également le 29 février en années bissextiles) et autorise des années allant de 0001 à 9999 (0000 dans une année invalide selon le grégorien calendrier)
la source
Je travaille avec une API qui n'accepte que le format MM / JJ / AAAA. Je n'ai trouvé aucun autre article qui fasse des années bissextiles aussi bien que la réponse d'Ofir , alors je l'ai peaufiné et je le publie à nouveau ici pour tous ceux qui pourraient en avoir besoin.
la source
validera le
MM/DD/YYYY
format avec1960
à2028
si vous avez besoin d'étendre le support des années bissextiles, ajoutez
c'est aussi du travail
si vous pouvez changer de format
mm-dd-yyyy
que de remplacer[/]
pour[-]
vérifier également en ligne http://regexr.com/la source
Pour la date MM / JJ / AAAA, vous pouvez utiliser
Il vérifie les jours et les mites appropriés.
N'oubliez pas que vous pouvez vérifier votre expression régulière à
regex101
ce que je recommande :)
S'amuser!
la source
cette regex validera les dates au format:
30-12-2016 (mm-jj-aaaa) ou 12-3-2016 (mm-j-aaaa) ou 1-3-2016 (md-aaaa) ou 1-30-2016 (m-jj-aaaa)
la source
Je sais que c'est une réponse tangentielle à la question, mais si l' intention de la question est `` comment valider une date? '', Alors pourquoi ne pas essayer de laisser le langage de programmation faire tout le travail (si vous utilisez un langage qui pouvez)?
par exemple en php
la source