Regulären Ausdruck für eine gültige Tag in einem Datum
Ich brauche Hilfe kommen mit einem regex um sicherzustellen, dass der Benutzer ein gültiges Datum
Die Zeichenfolge wird in das format der mm/dd/yyyy
Hier ist, was ich kommen mit so weit.
/\[1-9]|0[1-9]|1[0-2]\/\d{1,2}\/19|20\d\d/
Habe ich überprüft die regex in denen der Benutzer nicht geben Sie einen Tag höher als 12 ist und die Jahre beginnen entweder mit "19" oder "20". Was bin ich Schwierigkeiten ist es, herauszufinden, einige Logik für die Validierung des Tages. Der Tag sollte nicht gehen über 31.
- Ein regex scheint wie eine seltsame tool für dieses problem. Kann man nicht konvertieren Sie den text in ein Datum und prüfen Sie die Werte?
- Während dies könnte theoretisch gemacht werden, ein regex behandelt die richtige Anzahl der Tage für jeden Monat (einschließlich Schaltjahre) wäre wahnsinnig Komplex. Warum nicht einfach teilen Sie die Datum bis und testen Sie jede Komponente? (Oder noch besser, verwenden Sie eine der vielen date-Parser auf CPAN.)
- warum fragst du die gleiche Frage wieder, als vor einem Jahr??? questions/2573466/matching-a-date-in-perl. OK, vor einem Jahr haben Sie nicht bekam ein regex Antwort, aber ich hoffe, Sie sehen von @Seth Antwort regex ist nicht nützlich für die überprüfung eines Datums.
- Wenn ich wollte, dass alle Bedingungen, wie das Schaltjahr, dann hätte ich gesagt, so
- mein Punkt ist einfach, dass die meisten Menschen denken, Sie brauchen nur einen einfachen regex für Datums-Zeichenfolge, aber am Ende brauchen etwas "real". Wenn das nicht der Fall für Sie, kein problem 🙂 Wenn es so ist, gut, meine Antwort wird immer noch hier sein, wenn Sie es brauchen!
- Zerobu: Sie sagte also: "ein regex um sicherzustellen, dass der Benutzer ein gültiges Datum".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Regex für 0-31:
Oder wenn Sie nicht wollen, Tage mit einem vorangestellten null (z.B. 05):
gawk 'BEGIN{ for(i=0;i<=32;i++){ if (i ~ /^([0-2]?[1-9]|3[01])$/){print i "yes"}else {print i "no"} } }'
Andere Lösungen sind in Ordnung, wahrscheinlich arbeiten, etc. In der Regel werden Sie am Ende wollen Sie ein bisschen mehr 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. Verwenden Sie Sie! Manchmal sind Sie ein bisschen overkill, aber oft klappt für Sie die Straße hinunter.
$foo
ist nun ein DateTime-Objekt. Genießen.Wenn Ihr den Datums-string nicht richtig formatiert,
$foo
wird"undef"
und$dayFormat->errstr
werde Ihnen sagen, warum.01-31
dann RegEx ist in Ordnung, solange es gibt einige backend-Logik, die überprüft, das Datum als ganze, wenn Sie so gewünscht werden.Sehe ich die erwartete Antwort derzeit nicht für 10, 20.
gawk 'BEGIN{ for(i=0;i<=32;i++){ if (i ~ /^([0-2]?[1-9]|3[01])$/){print i " yes"}else {print i " no"} } }
^([0-2]?[1-9]|3[01]|10|20)$
So freundlich betrachten Sie die unten Lösung...
1. Identifizieren Sie die Sätze müssen angepasst werden:
{01,...,09},{10,...,31}
{10,...,31}
können aufgeteilt werden in=> {10,...,29},{30,31}
{1,...,31} => {1,...,9},{10,...,31}
2. Entsprechenden regulären Ausdrücke für jeden sub-set:
Nun können wir-Gruppe
([0][1-9])
und([1-9])
zusammen als([0]?[1-9])
. Wo?
bedeutet 0 oder 1 vorkommen des Muster/symbol. [UPDATE] - Danke @MattFrear für den Hinweis it out.So dass die resultierende RegEx:
^(([0]?[1-9])|([1-2][0-9])|(3[01]))$
Hier getestet: http://regexr.com/?383k1 [UPDATE]
([0][1-9])
und([1-9])
zusammen als([0]*[1-9])
... und es sollte klar sein([0]?[1-9])
. Vielen Dank für den test-Fall.Vom Ausdrücke, die in der Kategorie: Termine und Zeiten
Überprüft die richtige Anzahl von Tagen in einem Monat, wie es aussieht, meistert sogar Schaltjahre.
Können Sie natürlich ändern
[\.\-/]
mit/
nur Schrägstriche.Diese nicht alle , dass schwer...
Probieren Sie es aus:
/(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])\/((19|20)\d\d)/
Ist regulärer Ausdruck sein muss? Wenn nicht, Sie besser mit einem anderen Ansatz, wie
DateTime::Format::DateManip
Regex für 0-31 Tag:
0[1-9]|[12]\d|3[01]) ohne prefix 0) - wenn "1", "23"...
([1-9]|[12]\d|3[01]) mit Präfix 0 -, wenn "01", "04"
(0?[1-9]|[12]\d|3[01]) - mit oder ohne "0" - wenn ""