Regulärer Ausdruck, der einem gültigen Tag in einem Datum entspricht

8

Ich brauche Hilfe bei der Erstellung einer Regex, um sicherzustellen, dass der Benutzer ein gültiges Datum eingibt Die Zeichenfolge hat das Format mm/dd/yyyy

Hier ist, was ich bisher herausgefunden habe.

%Vor%

Ich habe die Regex validiert, wo der Benutzer keinen Tag höher als 12 eingeben kann und die Jahre mit "19" oder "20" beginnen müssen. Was ich habe Schwierigkeiten ist herauszufinden, eine Logik für die Validierung des Tages. Der Tag sollte nicht über 31 gehen.

    
Zerobu 20.05.2011, 19:56
quelle

7 Antworten

27

Regex für 0-31:

%Vor%

Oder wenn Sie keine Tage mit einer vorhergehenden Null (z. B. 05) möchten:

%Vor%     
bluepnume 20.05.2011, 20:00
quelle
12
%Vor%

Andere Lösungen sind in Ordnung, wahrscheinlich arbeiten, usw. Normalerweise wollen Sie ein bisschen mehr tun, und dann ein bisschen mehr, und schließlich haben Sie einige verrückte Code und Schaltjahre, und warum machst du es selbst wieder?

DateTime und seine Formatierer sind Ihre Lösung. Benutze sie! Manchmal sind sie ein wenig übertrieben, aber oft klappt das für dich auf der Straße.

%Vor%

$foo ist jetzt ein DateTime-Objekt. Genießen.

Wenn Ihre Datumszeichenfolge nicht korrekt formatiert wurde, wird $foo "undef" und $dayFormat->errstr wird Ihnen sagen warum.

    
Ryley 20.05.2011 20:13
quelle
8
  • Wie viele oben erwähnt haben, ist eine RegEx sehr schlecht, wenn wir das Datum als Ganzes validieren wollen.
  • Aber wenn wir mit einem Zahlenmuster übereinstimmen wollen, in diesem Fall von 01-31 , dann ist RegEx in Ordnung, solange es eine Backend-Logik gibt, die das Datum als Ganzes validiert gewünscht.
  • Ich sehe, dass die erwartete Antwort derzeit für 10, 20 fehlschlägt.

    • Test: gawk 'BEGIN{ for(i=0;i<=32;i++){ if (i ~ /^([0-2]?[1-9]|3[01])$/){print i " yes"}else {print i " no"} } }
    • Dies kann wie folgt korrigiert werden: ^([0-2]?[1-9]|3[01]|10|20)$

Bitte betrachten Sie die folgende Lösung ...

1. Identifizieren Sie die Mengen, die abgeglichen werden müssen:

  • Tage mit dem Präfix "0": {01,...,09},{10,...,31}
    • Untermenge {10,...,31} kann in => {10,...,29},{30,31} aufgeteilt werden
  • Ohne Präfix: {1,...,31} => {1,...,9},{10,...,31}

2. Entsprechende reguläre Ausdrücke für jede Untergruppe:

%Vor%

Jetzt können wir ([0][1-9]) und ([1-9]) zusammen als ([0]?[1-9]) gruppieren. Wobei ? 0 oder 1 Vorkommen des Musters / Symbols bedeutet. [UPDATE] - Vielen Dank @MattFrear, dass Sie darauf hingewiesen haben.

Die resultierende RegEx ist also: ^(([0]?[1-9])|([1-2][0-9])|(3[01]))$

Getestet hier: Ссылка [UPDATE]

    
Kent Pawar 09.12.2013 15:04
quelle
5
%Vor%

Von Ausdrücken in der Kategorie: Datum und Uhrzeit

Validiert die korrekte Anzahl der Tage in einem Monat, sieht so aus, als ob es sogar Schaltjahre behandelt.

Sie können natürlich [\.\-/] mit / so ändern, dass nur Schrägstriche zulässig sind.

    
Seth Robertson 20.05.2011 20:05
quelle
2

Das ist nicht alles das schwer ...

%Vor%     
ysth 20.05.2011 21:15
quelle
1

Probieren Sie es aus:
/(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])\/((19|20)\d\d)/

    
fvox 20.05.2011 20:01
quelle
1

Ist regelmäßiger Ausdruck ein Muss? Wenn nicht, sollten Sie einen anderen Ansatz verwenden, z. B. DateTime::Format::DateManip

%Vor%     
snoofkin 20.05.2011 20:17
quelle

Tags und Links