Regular Expression Match zum Testen auf ein gültiges Jahr

88

Bei einem bestimmten Wert möchte ich ihn validieren, um zu überprüfen, ob es sich um ein gültiges Jahr handelt. Meine Kriterien sind einfach, wenn der Wert eine Ganzzahl mit 4Zeichen sein soll. Ich weiß, dass dies nicht die beste Lösung ist, da es Jahre zuvor nicht zulässt 1000und Jahre wie z 5000. 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 zulässig.

Wie stelle ich sicher, dass nur positive ganze Zahlen zulässig sind?

Ranhiru Jude Cooray
quelle
fwiw Ich habe ein node.js-Projekt erstellt, to-regex-range , um diese Bereiche automatisch zu erstellen. Es ist schwieriger als es scheint, wenn Sie den regulären Ausdruck generieren müssen, um ihn für eine Reihe von Jahren zu testen.
Jonschlinkert
Warum sollten Sie Ihre Validierung auf 4-stellige Jahre beschränken? longnow.org
Dan Temple

Antworten:

75

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

^\d{4}$

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

Wenn Sie den Startanker hinzufügen, stimmen Sie nur mit den Zeichenfolgen überein, die mit 4 Ziffern beginnen und enden. Dies bedeutet effektiv, dass sie nur 4 Ziffern enthalten dürfen.

Codaddict
quelle
2
Verdammt! Meins war so fehlerhaft, dass es sogar akzeptiert hätte whateverblahblah2323. Jetzt verstehe ich, warum ein wenig Lernen gefährlich ist: O
Ranhiru Jude Cooray
60
Dies wird im Jahr 10.000 brechen.
Sferik
16
@sferik: Egal. Auf dem Originalplakat stand ausdrücklich, dass er nach vier Zeichen suchen wollte. Er gab nicht an, dass er wollte, dass das Jahr 10.000 eine gültige Eingabe ist, also 10000wäre das Akzeptieren ein Fehler.
Markusk
4
@sferik: Das Programm wird bis dahin für Jahrhunderte weg sein. Wenn nicht, ist es am besten, sich über 9.000 Jahre in der Zukunft Sorgen zu machen. Nach dem Prinzip von YAGNI ist der Ansatz gültig.
Phil
177

Jahre von 1000 bis 2999

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

Für 1900-2099

^(19|20)\d{2}$
r92
quelle
14
Dies ist eine viel bessere Lösung
mk_89
9
Ich bin besser, nicht erfassende Gruppe zu verwenden:^(?:19|20)\d{2}$
Eldar Agalarov
Wie würde ich ein vierstelliges Jahr zwischen 2011 und 2099 validieren?
Mcquaim
Wie kann ich (19|20)\d{2}meinen regulären Ausdruck hinzufügen , um ein Geburtsdatum zu validieren? Dies ist meine Regex /^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/Ich möchte sicherstellen, dass das Jahr immer 4-stellig ist und mit 19 ** oder 20 ** beginnt
10.
Verwenden Sie ^ (19 | 2 [0-9]) \ d {2} $ für die Jahre 1900 - 2999
MarcoZen
22

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

Es ist insofern falsch, als es mit Zeichenfolgen wie übereinstimmt 0001, was kein gültiges Jahr ist.

Es ist kurzsichtig, dass es nicht alle Werte über 9999. Have passen wir die Lehren aus bereits vergessen Y2K ? Verwenden Sie stattdessen den regulären Ausdruck:

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

Wenn Sie Jahre in der Vergangenheit und Jahre in der Zukunft abgleichen müssen, können Sie diesen regulären Ausdruck verwenden, um eine beliebige positive Ganzzahl abzugleichen:

^[1-9]\d*$

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

Hinweis: Dieser reguläre Ausdruck stimmt mit allen Jahren überein, einschließlich denen vor dem Jahr 1, da sie normalerweise mit einer BC-Bezeichnung anstelle einer negativen Ganzzahl dargestellt werden. Natürlich könnte sich diese Konvention in den nächsten Jahrtausenden ändern. Daher ist es am besten, eine beliebige Ganzzahl - positiv oder negativ - mit dem folgenden regulären Ausdruck abzugleichen:

^-?[1-9]\d*$
sferik
quelle
3
Nein, das wird es wahrscheinlich nicht. Aber jemand (Archäologe? Historiker?) Muss möglicherweise vor 8000 Jahren Jahre zusammenpassen. : D Und Doc Brown könnte es brauchen ...
Jaime
1
i verwendet , um dieses zu begrenzen Bereich von 1000-9999 ^ [1-9] \\ d {3} $ das ist , weil die Anwendung , die wir haben , um Daten zu liefern, zu akzeptieren 4 Ziffern bestehen :(
MatPag
Tolle Antwort. Ich würde es wie folgt machen, um auch das Jahr 0 zu akzeptieren: ^ (-? [1-9] \ d * | 0) $
Kosta Kontos
10

Dies funktioniert für 1900 bis 2099:

/(?:(?:19|20)[0-9]{2})/
jonschlinkert
quelle
sieht für mich so aus, als würde es nur bis 2099 gehen. Übrigens fragt das OP, wie man nur eine positive 4-stellige Zahl zulässt.
DeanOC
bah, 2099 habe ich gemeint. Vielen Dank. und jetzt sehe ich den positiven ganzen Teil.
Jonschlinkert
Ich habe ein Projekt erstellt, to-regex-range , um diese Bereiche automatisch zu erstellen
jonschlinkert
5

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

(19[789]\d|20[01]\d)
Renaud
quelle
Ihre Antwort erlaubt197999
avalanche1
Ich glaube nicht ... Der erste Teil der Regex stimmt mit der Nummer überein, die mit 19 beginnt, dann mit 7,8 oder 9, gefolgt von einer EINZELNEN Nummer. Die Regex 19[789]\d\d\dwürde erlauben197999
Renaud
1
/(19[789]\d|20[01]\d)/.test(1970324) >> true
avalanche1
Ja, es wird mit den ersten 4 Zahlen ( 1970) übereinstimmen , nicht mit den letzten 3. Was ist mit (19[789]\d|20[01]\d)[^0-9]? Das würde 1970 324aber nicht passen1970324
Renaud
1
Ich fand dieses nützlich, um das Filmjahr anhand eines Dateinamens zu finden ... in diesem Fall möchten wir Dinge ab den 1930er Jahren ... aber wir schließen dann die 1024 aus, die für die Videoqualität am Ende hinzugefügt wird
Adrian Hum
1

Sie können mit etw wie [ ^-]\d{4}$: 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 ...

PierrOz
quelle
1

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

Dhyey
quelle
Dies war genau das, was ich brauchte, die akzeptierte Antwort scheint keine gültige PCRE zu sein.
Prometheus
1

Theoretisch ist die 4-stellige Option richtig. In der Praxis ist es jedoch möglicherweise besser, eine Reichweite von 1900 bis 2099 zu haben.

Außerdem muss es sich um eine nicht erfassende Gruppe handeln. In vielen Kommentaren und Antworten wird vorgeschlagen, eine Gruppierung zu erfassen, die meiner Meinung nach nicht richtig ist. Denn zum Abgleichen könnte es funktionieren, aber zum Extrahieren von Übereinstimmungen mit Regex werden 4-stellige Zahlen und zweistellige (19 und 20) Zahlen auch aufgrund von Klammern extrahiert.

Dies funktioniert für eine genaue Übereinstimmung mit nicht erfassenden Gruppen:

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

Adil Aliyev
quelle
0

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

Comradin
quelle
0

Ich benutze diesen regulären Ausdruck 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

R2Rivs
quelle
0

/ ^ \ 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 angeben.

Dayz
quelle
0

Wenn Sie mit JJJJ oder JJJJMMTT übereinstimmen 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})$
Benjamin Goodacre
quelle
0

Sie können diesen auch verwenden.

([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)
Ranjeet Chouhan
quelle
Sie wollen nur das Jahr zusammenbringen. Außerdem stimmt Ihre Regex mit 00/00/2000oder 31/02/1999und vielen weiteren falschen Daten überein .
Toto
Dies könnte Ihnen helfen ([0-2] [0-9] | 3 [0-1]) \ / ([0-1] [0-2]) \ / (19 [789] \ d | 20 [01 ] \ d)
Ranjeet Chouhan
(0[1-9]|1[0-2])ist ein viel besserer Ausdruck für den Monat
EZ-C