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?

122
demandé sur Chris Martin 2013-03-19 09:11:08

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.

241
répondu Ofir Luzon 2017-05-23 11:55:03

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: enter image description here

205
répondu Alok Chaudhary 2014-11-17 12:21:56
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)$)
57
répondu gdZeus 2015-10-07 21:08:22

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.

12
répondu A.T. 2013-03-19 05:16:58

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

9
répondu Luke Madhanga 2014-03-28 17:08:48

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

Regular expression visualization

Debuggex Démo

9
répondu Simple-Solution 2015-04-15 13:32:51

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:

  1. 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).
  2. 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.

6
répondu Jason Greanya 2016-09-07 11:40:06

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 ).

quelques essais

5
répondu Nalaka526 2013-03-19 15:55:09
"^(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

4
répondu user3575114 2014-05-09 12:34:14

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

4
répondu Chase 2014-06-02 11:21:04

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]))))$
3
répondu Debanshu Kundu 2014-03-21 09:25:02

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.

3
répondu Jonny 5 2017-05-23 12:18:27

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})$/
1
répondu Daniel 2017-05-23 12:34:53
((((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 /

0
répondu mahesh 2016-06-28 14:52:45

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 à

regex101

que je recommande:)

amusez-vous bien!

0
répondu Przemysław Sienkiewicz 2016-10-21 12:18:10
^(((([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)

0
répondu mexekanez 2016-11-02 18:17:38