Regex pour valider le format de date jj/mm/aaaa [dupliquer]
cette question a déjà une réponse ici:
- Regex à la Date du match 7 réponses
j'ai besoin de valider une chaîne de date pour le format dd/mm/yyyy
avec une expresssion.
ce regex valide dd/mm/yyyy
, mais pas les dates invalides comme 31/02/4500
:
^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]d{4}$
Qu'est-ce qu'un regex valide pour valider le format dd/mm/yyyy
avec le soutien de l'année bissextile?
16 réponses
le regex que vous avez collé ne valide pas correctement les années bissextiles, mais il y en a un qui fait dans le même post .
Je l'ai modifié pour prendre dd/mm/yyyy
, dd-mm-yyyy
ou dd.mm.yyyy
^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2(?:(?:(?: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]))(?:(?:1[6-9]|[2-9]\d)?\d{2})$
je l'ai testé un peu dans le lien Arun fournis dans sa réponse et aussi ici et il semble fonctionner.
j'ai prolongé le regex donné par @Ofir Luzon pour les formats JJ-mmm-AAAA, JJ/mmm/AAAA, JJ.mmm.YYYY selon mon exigence. N'importe qui d'autre avec la même exigence peut se référer à ce
^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)(?:0?2|(?:Feb))(?:(?:(?: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]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))(?:(?:1[6-9]|[2-9]\d)?\d{2})$
et testé pour certains cas d'essai ici http://regexr.com/39tr1 .
pour une meilleure compréhension de cette expression régulière, référez-vous à cette image:
dd/MM/yyyy:
vérifie si l'année bissextile. Les années 1900 à 9999 sont valables. Uniquement JJ/MM / AAAA
(^(((0[1-9]|1[0-9]|2[0-8])[\/](0[1-9]|1[012]))|((29|30|31)[\/](0[13578]|1[02]))|((29|30)[\/](0[4,6,9]|11)))[\/](19|[2-9][0-9])\d\d$)|(^29[\/]02[\/](19|[2-9][0-9])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)
essayez ceci.
^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$
vous pouvez tester l'expression régulière à http://www.regular-expressions.info/javascriptexample.html facilement.
Pour ceux qui regardent ces et obtenir complètement confus, voici un extrait de mon script. Malheureusement, tout ce qu'il fait est de correspondre des numéros valides dans une date heure entrée, 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 correspondre à une date dans le format "AAAA-MM-JJ hh:mm '(ou bien dans n'importe quel ordre)
var dateerrors = false;
var yearReg = '(201[4-9]|202[0-9])'; ///< Allows a number between 2014 and 2029
var monthReg = '(0[1-9]|1[0-2])'; ///< Allows a number between 00 and 12
var dayReg = '(0[1-9]|1[0-9]|2[0-9]|3[0-1])'; ///< Allows a number between 00 and 31
var hourReg = '([0-1][0-9]|2[0-3])'; ///< Allows a number between 00 and 24
var minReg = '([0-5][0-9])'; ///< Allows a number between 00 and 59
var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g');
$('input').filter(function () {return this.id.match(/myhtml_element_with_id_\d+_datetime/);}).each(function (e) {
if (e > 0) {
// Don't test the first input. This will use the default
var val = $(this).val();
if (val && !val.trim().match(reg)) {
dateerrors = true;
return false;
}
}
});
if (dateerrors) {
alert('You must enter a validate date in the format "yyyy-mm-dd HH:MM", e.g. 2019-12-31 19:30');
return false;
}
Le script ci-dessus commence par la construction d'un objet regex. Il trouve alors toutes les entrées dont les id correspondent à un certain motif et ensuite boucle à travers ceux-ci. Je ne teste pas la première entrée que je trouve ( if (e > 0)
).
un peu d'explication:
var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g');
^
signifie début de match, tandis que $
signifie fin de match.
return this.id.match(/myhtml_element_with_id_\d+_datetime/);
\d+
signifie correspondre à une séquence unique ou contiguë d'entiers, donc myhtml_element_with_id_56_datetime
et myhtml_element_with_id_2_datetime
signifie match, mais myhtml_element_with_id_5a_datetime
ne sera pas
voici une autre version de regex pour correspondre à l'un des formats de date suivants et permettre d'omettre les zéros de tête:
Regex: ^[0-3]?[0-9].[0-3]?[0-9].(?:[0-9]{2})?[0-9]{2}$
corresponds:
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
je soupçonne que ce qui suit est aussi précis qu'on peut s'y attendre sans savoir quand le lieu de l'utilisateur est passé du calendrier julien au calendrier grégorien.
Il accepte '-', '/', ou rien que des séparateurs entre l'année, le mois et le jour, peu importe l'ordre.
Mmdjyyy:
^(((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]{4}|02[-/]?29[-/]?([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))$
jjmmaaaa:
^(((0[1-9]|[12][0-9]|30)[-/]?(0[13-9]|1[012])|31[-/]?(0[13578]|1[02])|(0[1-9]|1[0-9]|2[0-8])[-/]?02)[-/]?[0-9]{4}|29[-/]?02[-/]?([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))$
yyyyMMdd:
^([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]|0[0-9]|1[0-6])00)[-/]?02[-/]?29)$
autres que le calendrier grégorien s'écarte du calendrier julien jusqu'en 1700. Il a deux questions:
- il accepte l'année 0000, qui n'existe pas dans beaucoup, mais pas tous, les normes. Notez que la norme ISO 8601 accepte l'année 0000 (équivalent à 1 BCE).
- il ne manque pas les 10-13 jours perdus lors de l'utilisation du calendrier grégorien. Ceci varie en fonction de la localité bien. Par exemple, l'Église catholique romaine a sauté 10 jours, du 5 octobre au 14 octobre 1582, mais la Grèce (la dernière à changer) a sauté le 16 février par le 28 de 1923, 13 jours, devant prendre en compte les années bissextiles de 1700, 1800, et 1900.
ceci a été testé par rapport à L'implémentation du calendrier de Java de l'année 0001 à l'année 9999 avec la seule différence étant les 10 jours ci-dessus en 1582.
trouvé ce reg ex ici
^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$
valide correctement le format mm/dd/yyyy
et les dates valides (mais pas m/d/yyyy
).
"^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\d\d)$"
validera n'importe quelle date entre 1900-2099
L'expression suivante est agréable et facile à manipuler:
((((0[13578]|1[02])(\/|-|.)(0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)(\/|-|.)(0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)((\/|-|.)(0[1-9]|1[0-9]|2[0-8]))))(\/|-|.)(19([6-9][0-9])|20(0[0-9]|1[0-4])))|((02)(\/|-|.)(29)(\/|-|.)(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26])))
il est valide selon le format MM/JJ/AAAA et permet le soutien des années bissextiles de 1960 à 2016. Si vous avez besoin du soutien de l'année bissextile prolongée vous n'avez besoin de manipuler cette partie de l'expression:
(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]))
Espère que cela vous a aidé beaucoup
une autre réponse qui valide le jour (JJ) en fonction du mois (mm) et de l'année (AAAA) (c.-à-d. valide également le 29 février dans les années bissextiles) et permet des années allant de 0001 à 9999 (0000 dans une année invalide selon le calendrier grégorien)
^(?:(?:(?:0[1-9]|[12]\d|3[01])/(?:0[13578]|1[02])|(?:0[1-9]|[12]\d|30)/(?:0[469]|11)|(?:0[1-9]|1\d|2[0-8])/02)/(?!0000)\d{4}|(?:(?:0[1-9]|[12]\d)/02/(?:(?!0000)(?:[02468][048]|[13579][26])00|(?!..00)\d{2}(?:[02468][048]|[13579][26]))))$
ici j'ai écrit un pour dd/mm/yyyy
où le séparateur peut être un de -.,/
gamme d'année 0000-9999
.
il s'agit de années bissextiles et est conçu pour les saveurs regex, qui supportent lookheads, capturing groups and backreferences. Non valable pour tel que d/m/yyyy
. Si nécessaire, ajouter d'autres séparateurs à [-.,/]
^(?=\d{2}([-.,\/])\d{2}\d{4}$)(?:0[1-9]|1\d|[2][0-8]|29(?!.02.(?!(?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)\d{2}(?:[02468][048]|[13579][26])))|30(?!.02)|31(?=.(?:0[13578]|10|12))).(?:0[1-9]|1[012]).\d{4}$
essai à regex101 ; comme une chaîne de caractères Java:
"^(?=\d{2}([-.,\/])\d{2}\1\d{4}$)(?:0[1-9]|1\d|[2][0-8]|29(?!.02.(?!(?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)\d{2}(?:[02468][048]|[13579][26])))|30(?!.02)|31(?=.(?:0[13578]|10|12))).(?:0[1-9]|1[012]).\d{4}$"
expliquée:
(?x) # modifier x: free spacing mode (for comments)
# verify date dd/mm/yyyy; possible separators: -.,/
# valid year range: 0000-9999
^ # start anchor
# precheck xx-xx-xxxx,... add new separators here
(?=\d{2}([-.,\/])\d{2}\d{4}$)
(?: # day-check: non caturing group
# days 01-28
0[1-9]|1\d|[2][0-8]|
# february 29d check for leap year: all 4y / 00 years: only each 400
# 0400,0800,1200,1600,2000,...
29
(?!.02. # not if feb: if not ...
(?!
# 00 years: exclude !0 %400 years
(?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)
# 00,04,08,12,...
\d{2}(?:[02468][048]|[13579][26])
)
)|
# d30 negative lookahead: february cannot have 30 days
30(?!.02)|
# d31 positive lookahead: month up to 31 days
31(?=.(?:0[13578]|10|12))
) # eof day-check
# month 01-12
.(?:0[1-9]|1[012])
# year 0000-9999
.\d{4}
$ # end anchor
voir Aussi DONC la Regex FAQ ; s'il vous Plaît laissez-moi savoir, s'il échoue.
je travaille avec une API qui seulement accepte le format MM/JJ/AAAA. Je ne pouvais pas trouver d'autre poste qui a fait des années bissextiles tout aussi bien que Ofir la réponse , donc je l'ai modifié et je le re-posting ici pour quiconque qui pourrait avoir besoin.
/^(?:(?:(?:0[13578]|1[02])(\/)31)|(?:(?:0[1,3-9]|1[0-2])(\/)(?:29|30)))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:02(\/)29(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/)(?:0[1-9]|1\d|2[0-8])(?:(?:1[6-9]|[2-9]\d)?\d{2})$/
((((0[13578]|1[02])\/(0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)\/(0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)(\/(0[1-9]|1[0-9]|2[0-8]))))\/(19([6-9][0-9])|20([0-9][0-9])))|((02)\/(29)\/(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))
va valider le format MM/DD/YYYY
avec 1960
à 2028
si vous devez prolonger le soutien de l'année bissextile, ajouter
19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048]|3[26]|4[048])))
c'est aussi un travail
^((((0[13578]|1[02])[/](0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)[/](0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)([/](0[1-9]|1[0-9]|2[0-8]))))[/](19([6-9][0-9])|20([0-9][0-9])))|((02)[/](29)[/](19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))
si vous pouvez changer le format mm-dd-yyyy
que remplacer [/]
par [-]
aussi vérifier en ligne http://regexr.com /
pour la date MM / JJ/AAAA vous pouvez utiliser
^((((0[13578])|([13578])|(1[02]))[\/](([1-9])|([0-2][0-9])|(3[01])))|(((0[469])|([469])|(11))[\/](([1-9])|([0-2][0-9])|(30)))|((2|02)[\/](([1-9])|([0-2][0-9]))))[\/]\d{4}$|^\d{4}$
il vérifie les jours et les mites appropriés.
Remeber que vous pouvez vérifier votre expression régulière à
que je recommande:)
amusez-vous bien!
^(((([13578]|0[13578]|1[02])[-](0[1-9]|[1-9]|1[0-9]|2[0-9]|3[01]))|(([469]|0[469]|11)[-]([1-9]|1[0-9]|2[0-9]|3[0]))|((2|02)([-](0[1-9]|1[0-9]|2[0-8]))))[-](19([6-9][0-9])|20([0-9][0-9])))|((02)[-](29)[-](19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))
cette regex sera de valider les dates dans le format:
12-30-2016 (mm-JJ-AAAA) ou 12-3-2016 (mm-j-AAAA) ou 1-3-2016 (M-J-AAAA) ou 1-30-2016 (m-JJ-AAAA)