web-dev-qa-db-de.com

Regular Expression Match zum Testen eines gültigen Jahres

Wenn ich einen Wert habe, möchte ich ihn validieren, um zu prüfen, ob es ein gültiges Jahr ist. Meine Kriterien sind einfach, wobei der Wert eine ganze Zahl mit 4-Zeichen sein sollte. Ich weiß, dass dies nicht die beste Lösung ist, da es Jahre vor 1000 und Jahren wie 5000 nicht zulassen wird. Dieses Kriterium ist für mein aktuelles Szenario ausreichend.

Was ich mir ausgedacht habe ist

\d{4}$

Während dies funktioniert, sind auch negative Werte möglich.

Wie kann ich sicherstellen, dass nur positive ganze Zahlen zulässig sind?

65
Ranhiru Cooray

Sie müssen einen Startanker ^ hinzufügen als:

^\d{4}$

Ihr Regex \d{4}$ stimmt mit den Zeichenfolgen überein, die mit 4 Ziffern enden. Eingaben wie -1234 werden daher akzeptiert.

Durch das Hinzufügen des Startankers passen Sie nur die Zeichenfolgen an, die begin und end mit 4 Ziffern, was bedeutet, dass sie nur 4 Ziffern enthalten müssen.

63
codaddict

Jahre von 1000 bis 2999

^[12][0-9]{3}$

Für 1900-2099

^(19|20)\d{2}$
138
r92

Die "akzeptierte" Antwort auf diese Frage ist sowohl falsch als auch kurzsichtig.

Es ist falsch, dass es mit Zeichenfolgen wie 0001 übereinstimmt, die kein gültiges Jahr sind.

Es ist insofern kurzsichtig, als es nicht mit Werten oberhalb von 9999 übereinstimmt. Haben wir die Lektionen von Y2K schon vergessen? Verwenden Sie stattdessen den regulären Ausdruck:

^[1-9]\d{3,}$

Wenn Sie Jahre mit der Vergangenheit abgleichen müssen, können Sie zusätzlich zu den Jahren mit diesem regulären Ausdruck eine beliebige positive ganze Zahl verwenden:

^[1-9]\d*$

Auch wenn Sie keine Datumsangaben aus der Vergangenheit erwarten, möchten Sie diesen regulären Ausdruck trotzdem verwenden, nur für den Fall, dass jemand eine Zeitmaschine erfindet und Ihre Software mitnehmen möchte.

Hinweis: Dieser reguläre Ausdruck gilt für alle Jahre, einschließlich der Jahre vor dem Jahr 1, da sie normalerweise mit einer BC-Bezeichnung anstelle einer negativen Ganzzahl dargestellt werden. Natürlich kann sich diese Konvention im Laufe der nächsten Jahrtausende ändern. Daher ist es am besten, wenn Sie eine beliebige Zahl (positive oder negative) mit dem folgenden regulären Ausdruck abgleichen:

^-?[1-9]\d*$
21
sferik

Dies funktioniert für 1900 bis 2099:

/(?:(?:19|20)[0-9]{2})/
9
jonschlinkert

Aufbauend auf der Antwort von @ r92 für die Jahre 1970-2019

(19[789]\d|20[01]\d)
4
Renaud

Theoretisch ist die 4-stellige Option richtig. In der Praxis könnte es jedoch besser sein, einen Bereich von 1900-2099 zu haben.

Darüber hinaus muss es sich um eine Gruppe ohne Erfassung handeln. Viele Kommentare und Antworten schlagen eine Gruppierung vor, die meiner Meinung nach nicht richtig ist. Das Matching kann zwar funktionieren, aber für das Extrahieren von Übereinstimmungen mit Regex werden 4-stellige Zahlen und zweistellige (19 und 20) Zahlen auch aufgrund von Paranthesis extrahiert.

Dies funktioniert für den exakten Abgleich mit nicht erfassenden Gruppen:

(?:19|20)\d{2}

1
Adil Aliyev

Um ein Jahr in einer Zeichenfolge zu testen, die andere Wörter zusammen mit dem Jahr enthält, können Sie den folgenden Regex verwenden: \ b\d {4}\b

1
Dhyey

Benutzen;

^(19|[2-9][0-9])\d{2}$ 

für die Jahre 1900 - 9999.

Keine Sorge um 9999 und mehr - A.I. Bis dahin wird alles programmiert !!! Hehehehe

Sie können Ihre Regex testen unter https://regex101.com/

Weitere Informationen zu nicht erfassenden Gruppen (oben in den Kommentaren erwähnt) finden Sie hier http://www.manifold.net/doc/radian/why_do_non-capture_groups_exist_.htm

1
MarcoZen

sie können mit etw wie [^-]\d{4}$ gehen: Sie verhindern, dass das Minuszeichen - vor Ihren 4 Ziffern steht.
Sie können auch ^\d{4}$ mit ^ verwenden, um den Anfang der Zeichenfolge abzufangen. Es hängt tatsächlich von Ihrem Szenario ab ...

1
PierrOz

Ich benutze diese Regex in Java ^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$

Werke von 1900 bis 9999

0
R2Rivs

Sie können diesen auch verwenden.

([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)
0
Ranjeet Luhar

/^\d {4} $/ Hiermit wird geprüft, ob eine Zeichenfolge nur aus 4 Zahlen besteht. In diesem Szenario können Sie zur Eingabe eines Jahres 989 stattdessen 0989 eingeben.

0
Dayz

Sie können Ihre Ganzzahl in eine Zeichenfolge konvertieren. Da das Minuszeichen nicht mit den Ziffern übereinstimmt, haben Sie keine negativen Jahre.

0
Comradin

Wenn Sie YYYY oder YYYYMMDD anpassen müssen, können Sie Folgendes verwenden:

^((?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(?:0?2(?:29)))|(?:(?:[1-9]\d{3})(?:(?:(?:0?[13578]|1[02])(?:31))|(?:(?:0?[13-9]|1[0-2])(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8])))))|(?:19|20)\d{2})$
0