Regex zur Überprüfung des Datumsformats TT / MM / JJJJ

171

Ich muss eine Datumszeichenfolge für das Format dd/mm/yyyymit einem regulären Ausdruck überprüfen.

Dieser reguläre Ausdruck überprüft dd/mm/yyyy, jedoch nicht die ungültigen Daten wie 31/02/4500:

^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$

Was ist ein gültiger regulärer Ausdruck zur Validierung des dd/mm/yyyyFormats mit Schaltjahrunterstützung?

Nalaka526
quelle
3
Ich denke, es könnte hilfreich sein, wenn Sie eine genaue Erwartung festlegen, da dieser reguläre Ausdruck Schaltjahre NICHT korrekt validiert. Beispiel: Es gibt keinen 29. Februar 2013, aber dieser reguläre Ausdruck bestätigt
TML
7
Warum mit Regex? Es gibt einfachere (und genauere) Wege ...
Dan Puzey
2
Reguläre Ausdrücke dienen zum Abgleichen von Mustern und nicht zum Überprüfen numerischer Werte. Suchen Sie eine wahrscheinliche Zeichenfolge mit dem regulären Ausdruck und überprüfen Sie den numerischen Wert in Ihrer Hostsprache (PHP, was auch immer).
Andy Lester
3
Diese Antwort wurde zu den häufig gestellten Fragen zum Stapelüberlauf für reguläre Ausdrücke unter "Allgemeine Validierungsaufgaben" hinzugefügt .
Aliteralmind
4
@ BurhanKhalid: Du liegst falsch. Regulärer Ausdruck ist das beste Werkzeug für die Validierung, da die HTML5-Eingabe ein Attribut mit dem Namen " patternRegulärer Ausdruck" enthält und die Browser automatisch ohne Verwendung von Javascript anhand des regulären Ausdrucks validieren. Nur durch Setzen eines regulären Ausdrucks im Musterattribut!
Ehrfurcht

Antworten:

327

Der Regex, den Sie eingefügt haben, validiert Schaltjahre nicht korrekt, aber es gibt einen, der im selben Beitrag verwendet wird . Ich habe es geändert, um zu nehmen dd/mm/yyyy, dd-mm-yyyyoder dd.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})$

Ich habe es ein bisschen in dem Link getestet, den Arun in seiner Antwort angegeben hat, und auch hier und es scheint zu funktionieren.

Bearbeiten 14. Februar 2019: Ich habe ein Komma in der Regex entfernt, das Daten wie erlaubt 29-0,-11

Ofir Luzon
quelle
9
Epischer Regex! Wie leicht könnte dies je nach Format ausgetauscht werden? Zum Beispiel JJJJ-MM-TT und MM-TT-JJJJ. Ich habe versucht, es in diesem Sinne zu verstehen, aber es geht über meine Regex-Fähigkeiten hinaus.
Frau Wadge
7
Anders als DD/MM/YYYYdiese regex akzeptiert auch , DD/MM/YYdie ich bin mir nicht sicher , dass es in der ursprünglichen Absicht des Plakats war. Wenn Sie 'YY' nicht unterstützen möchten, entfernen Sie alle optionalen ?Quantifizierer.
user1485864
2
@PurveshDesai ersetzen jeweils 0?durch 0und entfernen auch das letzte Vorkommen von ?.
Ofir Luzon
4
@MaraisRossouw, Sie haben Recht, für 4-stelliges Jahr gibt es tatsächlich 3 ?, die entfernt werden sollten: Ersetzen Sie alle (?:1[6-9]|[2-9]\d)?durch (?:1[6-9]|[2-9]\d).
Ofir Luzon
2
Schauen Sie doch mal vorbei: WOW und natürlich danke
Jero Dungog
266

Ich habe den von @Ofir Luzon angegebenen regulären Ausdruck für die Formate TT-MMM-JJJJ, TT / MMM / JJJJ, TTMMM.JJJJ gemäß meiner Anforderung erweitert. Jeder andere mit der gleichen Anforderung kann darauf verweisen

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)(?:0?2|(?:Feb))\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]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

und für einige Testfälle hier getestet http://regexr.com/39tr1 .

Zum besseren Verständnis dieses regulären Ausdrucks beziehen Sie sich auf dieses Bild: Geben Sie hier die Bildbeschreibung ein

Alok Chaudhary
quelle
1
Ja, wie haben Sie es generiert? :)
Rasiermesser
Ich habe es online über eine Website erstellt und erinnere mich jetzt auch nicht an die Website, von der ich dieses Bild erstellt habe. Ich werde die Referenz hinzufügen, sobald ich mich erinnere :)
Alok Chaudhary
4
@ user3733831 8888ist ein mögliches Jahr. Ich erwarte, ungefähr in diesem Alter zu leben.
Dan Nissenbaum
1
Funktioniert auch für Schaltjahre hervorragend. Ich habe auch Unterstützung für kurze spanische Monatsnamen hinzugefügt.
Fer R
2
@ AlokChaudhary, das Diagramm wurde mit debuggex.com
Taha BASRI
69

Beachten:

Ihr regulärer Ausdruck funktioniert seit Jahren nicht mehr, wenn "Vielfache von 4 und 100, aber nicht von 400" sind. Jahre, die diesen Test bestehen, sind keine Schaltjahre. Beispiel: 1900, 2100, 2200, 2300, 2500 usw. Mit anderen Worten, alle Jahre mit dem Format \ d \ d00 werden in dieselbe Klasse von Schaltjahren eingeordnet, was falsch ist. - MuchToLearn

Es funktioniert also nur für [1901 - 2099] (Puh) properly richtig

DD / MM / JJJJ:

Überprüft das Schaltjahr. Jahre von 1900 bis 9999 sind gültig. Nur TT / MM / JJJJ

(^(((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)$)
gdZeus
quelle
7
Diese Antwort funktioniert nur mit TT / MM / JJJJ. Daher ist die richtige Antwort.
Rodrigo
2
@ SylvainB Ich habe es behoben
gdZeus
2
@gdZeus Danke für die Lieferung, auch zwei Jahre später! Es ist beängstigend zu glauben, dass eine unvollständige Lösung hier schon so lange bestätigt wurde.
SylvainB
Um es schneller zu machen, können Sie die Gruppen nicht gruppieren. regexr.com/3esom ^ (? :(? :(? :(?: 0 [1-9] | 1 [0-9] | 2 [0-8]) [\ /] (?: 0 [1- 9] | 1 [)]) | (? :(?: 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)) $
Matt Vukomanovic
Ich nehme an, ich habe einen Fehler gefunden: 29/02/2100existiert nicht (2100 ist KEIN Schaltjahr), wird aber dennoch von dem angegebenen Muster akzeptiert.
KnorxThieus
17

Versuche dies.

^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$

Sie können den regulären Ausdruck unter http://www.regular-expressions.info/javascriptexample.html einfach testen .

BEIM
quelle
2
Diese Regex validiert das Datum nicht mit dem Monat wie 30-02-2001... trotzdem danke für die Antwort :)
Nalaka526
12

Ich vermute, dass das Folgende so genau ist, wie es zu erwarten ist, ohne zu wissen, wann das Gebietsschema des Benutzers vom julianischen auf den gregorianischen Kalender umgestellt wurde.

Es akzeptiert entweder '-', '/' oder nichts als Trennzeichen zwischen Jahr, Monat und Tag, unabhängig von der Reihenfolge.

MMddyyyy:

^(((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))$

DD / MM / JJJJ:

^(((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)$

Abgesehen von der Reihenfolge entsprechen diese alle dem julianischen Kalender (Schaltjahr alle vier Jahre) bis 1700, wenn der gregorianische Kalender vom julianischen abweicht. Es gibt zwei Probleme:

  1. Es akzeptiert das Jahr 0000, das in vielen, aber nicht allen Standards nicht existiert. Beachten Sie, dass ISO 8601 das Jahr 0000 akzeptiert (entspricht 1 BCE).
  2. Die 10-13 Tage, die bei der Verwendung des Gregorianischen Kalenders verloren gingen, werden nicht übersprungen. Dies variiert jedoch je nach Ort. Zum Beispiel übersprang die römisch-katholische Kirche 10 Tage vom 5. bis 14. Oktober 1582, während Griechenland (das letzte, das wechselte) den 16. Februar bis zum 28. Februar 1923 übersprang, 13 Tage, um die Schaltjahre von 1700 zu berücksichtigen. 1800 und 1900.

Dies wurde anhand der Kalenderimplementierung von Java vom Jahr 0001 bis zum Jahr 9999 getestet, wobei die einzige Diskrepanz die oben genannten 10 Tage im Jahr 1582 waren.

Jason Greanya
quelle
Der reguläre Ausdruck JJJJMMTT stimmt nicht mit [01 | 02 | 03 | 05 | 06 | 07 | 09 | 10 | 11 | 13 | 14 | 15] 00-02-29 überein. Regex korrigiert : ^([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)$. Getestet mit Python: repl.it/repls/DependentBestChapters
kpr
10

Für diejenigen, die sich diese ansehen und völlig verwirrt sind, ist hier ein Auszug aus meinem Skript. Leider stimmt es nur mit gültigen Zahlen in einer Datums- / Uhrzeit-Eingabe überein, und der 31. Februar wird als gültig markiert, aber wie so viele gesagt haben, ist Regex wirklich nicht das beste Werkzeug, um diesen Test durchzuführen.

Um ein Datum im Format 'JJJJ-MM-TT hh: mm' abzugleichen (oder in beliebiger Reihenfolge)

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;
}

Das obige Skript beginnt mit dem Erstellen eines Regex-Objekts. Es findet dann alle Eingaben, deren IDs einem bestimmten Muster entsprechen, und durchläuft diese dann. Ich teste nicht die erste Eingabe, die ich finde ( if (e > 0)).

Ein bisschen Erklärung:

var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g');

^bedeutet Spielbeginn, während Spielende $bedeutet.

return this.id.match(/myhtml_element_with_id_\d+_datetime/);

\d+bedeutet, dass eine einzelne oder eine zusammenhängende Folge von ganzen Zahlen übereinstimmt, also myhtml_element_with_id_56_datetimeund myhtml_element_with_id_2_datetimeübereinstimmt, aber myhtml_element_with_id_5a_datetimenicht

Luke Madhanga
quelle
8

Hier ist eine andere Version von Regex, die mit einem der folgenden Datumsformate übereinstimmt und das Weglassen führender Nullen ermöglicht:

Regex: ^[0-3]?[0-9].[0-3]?[0-9].(?:[0-9]{2})?[0-9]{2}$

Streichhölzer:

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

Visualisierung regulärer Ausdrücke

Debuggex-Demo

Einfache Lösung
quelle
4
wenn Sie nicht funktioniert haben 13/13/2000= Spielen ist wahr
Andrei Krasutski
3
39/39/39 ist kein Datum. Bitte hören Sie auf, für diese Antwort zu stimmen.
Warren Sergent
6

Hier habe ich einen geschrieben, bei dd/mm/yyyydem der Separator ein -.,/Jahr sein kann 0000-9999.

Es befasst sich mit Schaltjahren und wurde für Regex-Aromen entwickelt , die Lookaheads, das Erfassen von Gruppen und Rückreferenzen unterstützen. NICHT gültig für wie d/m/yyyy. Fügen Sie bei Bedarf weitere Trennzeichen hinzu[-.,/]

^(?=\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}$

Test bei regex101 ; als Java-String:

"^(?=\\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}$"

erklärt:

(?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}\1\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

Siehe auch SO Regex FAQ ; Bitte lassen Sie mich wissen, wenn es fehlschlägt.

Jonny 5
quelle
5

Fand diese reg ex hier

^(((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))))$

Dies validiert das Format mm/dd/yyyyund die gültigen Daten korrekt (aber nicht m/d/yyyy).

Einige Tests

Nalaka526
quelle
1
Funktioniert nur vor 2014, muss | 20 (0 [0-9] | 1 [0-4]))) in | 20 (0 [0-9] | 1 [0-9])) geändert werden, um bis zu unterstützen 2019
Tony Dong
5
"^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\\d\\d)$"

wird jedes Datum zwischen validieren 1900-2099

user3575114
quelle
5

Der folgende Ausdruck ist nett und leicht zu manipulieren:

((((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])))

Es wird gemäß dem Format MM / TT / JJJJ validiert und ermöglicht die Unterstützung von Schaltjahren von 1960 bis 2016. Wenn Sie die erweiterte Unterstützung für Schaltjahre benötigen, müssen Sie nur diesen Teil des Ausdrucks bearbeiten:

(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]))

Hoffe das hat dir sehr geholfen

Verfolgungsjagd
quelle
3

Eine andere Antwort, die den Tag (TT) in Abhängigkeit vom Monat (MM) und dem Jahr (JJJJ) validiert (dh auch den 29. Februar in Schaltjahren validiert) und Jahre im Bereich von 0001 bis 9999 (0000 in einem ungültigen Jahr nach Gregorianisch) zulässt Kalender)

^(?:(?:(?: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]))))$
Debanshu Kundu
quelle
1
validiert nicht 18/05/0017
1

Ich arbeite mit einer API, die nur das Format MM / TT / JJJJ akzeptiert. Ich konnte keinen anderen Beitrag finden, der so gut sprang wie Ofirs Antwort , also habe ich ihn optimiert und poste ihn hier erneut für alle, die ihn benötigen könnten.

/^(?:(?:(?:0[13578]|1[02])(\/)31)\1|(?:(?:0[1,3-9]|1[0-2])(\/)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:02(\/)29\3(?:(?:(?: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])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/
Daniel
quelle
0
((((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])))

validiert das MM/DD/YYYYFormat mit 1960bis2028

Wenn Sie die Schaltjahrunterstützung verlängern müssen, fügen Sie hinzu

19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048]|3[26]|4[048])))

Das ist auch Arbeit

^((((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])))

Wenn Sie das Format ändern können, mm-dd-yyyyersetzen Sie es, um [/]es [-] auch online zu überprüfen. http://regexr.com/

Mahesh
quelle
0

Für das Datum MM / TT / JJJJ können Sie verwenden

^((((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}$

Es überprüft die richtigen Tage und Motten.

Denken Sie daran, dass Sie Ihren regulären Ausdruck unter überprüfen können

regex101

was ich empfehle :)

Habe Spaß!

Przemysław Sienkiewicz
quelle
0
^(((([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])))

Diese Regex validiert Daten im Format:

12-30-2016 (MM-TT-JJJJ) oder 12-3-2016 (MM-TT-JJJJ) oder 1-3-2016 (MD-JJJJ) oder 1-30-2016 (MM-TT-JJJJ)

mexekanez
quelle
0

Ich weiß, dass es eine tangentiale Antwort auf die Frage ist, aber wenn die Absicht der Frage lautet: "Wie validiere ich ein Datum?", Warum dann nicht versuchen, die Programmiersprache die ganze harte Arbeit machen zu lassen (wenn Sie eine Sprache verwenden, die dies tut?) können)?

zB in php

$this_date_object = date_create($this_date);

if ($this_date_object == false )
    {

        // process the error

    }
Neil Iosson
quelle