2010-12-07 11 views
55

Gegeben ein Wert Ich möchte es überprüfen, um zu überprüfen, ob es ein gültiges Jahr ist. Meine Kriterien sind einfach, wobei der Wert eine Ganzzahl mit 4 Zeichen sein sollte. Ich weiß, dass dies nicht die beste Lösung ist, da es Jahre vor 1000 Jahren nicht erlauben wird und Jahre wie 5000 erlauben werden. Dieses Kriterium ist für mein derzeitiges Szenario angemessen.Regulärer Ausdruck Match für ein gültiges Jahr zu testen

Was mit I

\d{4}$

kam Während dies funktioniert es auch negative Werte.

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

+0

FWIW Ich habe ein node.js Projekt [ to-regex-range] (https://github.com/jonschlellkert/to-regex-range) um diese Bereiche automatisch zu erstellen. Es ist schwieriger als es scheint, wenn Sie die Regex für eine Reihe von Jahren testen müssen. – jonschlinkert

Antwort

58

Sie benötigen einen Start Anker hinzufügen ^ als:

^\d{4}$ 

Ihre regex \d{4}$ wird Strings übereinstimmen, die mit 4 Ziffern zu beenden. So wird die Eingabe wie -1234 akzeptiert.

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

+1

Verdammt! Meines war so fehlerhaft, dass es sogar "whateverblahblah2323" akzeptiert hätte. Jetzt verstehe ich, warum ein wenig Lernen gefährlich ist: O –

+37

Dies wird im Jahr 10.000 brechen. – sferik

+11

@sferik: Macht nichts. Das ursprüngliche Plakat erklärte ausdrücklich, dass er nach vier Charakteren suchen wollte. Er gab nicht an, dass er wollte, dass das Jahr 10.000 als gültige Eingabe gilt, also würde die Annahme von "10000" ein Fehler sein. – markusk

1

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

126

Jahre ab 1000 zu 2999

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

Für 1900-2099

^(19|20)\d{2}$ 
+7

Dies ist eine viel bessere Lösung –

+6

Ich bin besser, nicht einfangende Gruppe zu verwenden: '^ (?: 19 | 20) \ d {2} $' –

+0

Wie würde ich ein 4-stelliges Jahr zwischen 2011 und 2099 validieren? – mcquaim

0

Sie Ihre ganze Zahl in einen String umwandeln könnte. Da das Minuszeichen nicht mit den Ziffern übereinstimmt, haben Sie keine negativen Jahre.

17

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

Es ist falsch, da es Strings wie 0001, die kein gültiges Jahr ist, übereinstimmen.

Es ist kurzsichtig darin, dass es nicht entspricht alle Werte über 9999. Haben wir schon die Lektionen von Y2K vergessen? Stattdessen den regulären Ausdruck verwenden:

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

Wenn Sie Jahren neben Jahre in der Zukunft in der Vergangenheit müssen übereinstimmen, können Sie diesen regulären Ausdruck jede positive ganze Zahl entsprechen:

^[1-9]\d*$ 

Auch wenn Sie keine Daten aus der Vergangenheit erwarten, sollten Sie diesen regulären Ausdruck trotzdem verwenden, falls jemand eine Zeitmaschine erfindet und Ihre Software mitnehmen möchte.

Hinweis: Dieser reguläre Ausdruck entspricht allen Jahren, einschließlich denen vor dem Jahr 1, da sie normalerweise mit einer BC-Bezeichnung anstelle einer negativen Ganzzahl dargestellt werden. Natürlich könnte diese Konvention über die nächsten Jahrtausende ändern, so die beste Wahl eine beliebige ganze Zahl positiv oder negativ mit dem folgenden regulären Ausdruck übereinstimmen ist:

^-?[1-9]\d*$ 
+10

wow. Wenn meine App in 8000 Jahren läuft ... –

+2

Nein, wird es wahrscheinlich nicht. Aber jemand (Archäologe? Historiker?) Könnte Jahre vor 8000 Jahren passen müssen. : D Und Doc Brown könnte es brauchen ... – Jaime

+1

Ich habe dies verwendet, um den Bereich von 1000-9999^[1-9] \\ d {3} $ zu begrenzen, das ist, weil die Anwendung, die wir Daten bereitstellen müssen, 4-stellige Zahlen akzeptieren nur :( – MatPag

5

Aufbauend auf @ r92 Antwort, seit Jahren 1970- 2019:

(19[789]\d|20[01]\d) 
+0

Ihre Antwort erlaubt '197999' – avalanche1

+0

ich nicht Ich denke, es funktioniert ... Der erste Teil der Regex entspricht der Zahl, beginnend mit 19, gefolgt von einer Zahl von 7, 8 oder 9, gefolgt von einer EINZIGEN Zahl, und die Regex '19 [789] \ d \ d \ d' würde' erlauben 197999 ' – Renaud

+0

' /(19[789]\d|20[01]\d)/.test(1970324) >> true' – avalanche1

0

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

Works 1900-9999

7

Diese für 1900-2099 funktioniert:

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

sieht für mich so aus, als würde es nur bis 2099 gehen BT fragt das OP, wie man nur die positive 4-stellige Nummer zulässt – DeanOC

+0

bah, 2099 ist was ich meinte. Vielen Dank. und jetzt sehe ich den positiven ganzen Teil. – jonschlinkert

+0

Ich habe ein Projekt erstellt, [to-regex-range] (https://github.com/jonschlellkert/to-regex-range) um diese Bereiche automatisch zu erstellen – jonschlinkert

0

/^ \ d {4} $/ Dies wird überprüfen, ob eine Reihe von nur 4 Zahlen besteht. Um in diesem Szenario ein Jahr 989 einzugeben, geben Sie stattdessen 0989 ein.

0

zu einem Jahr in einem String zu testen, die zusammen mit dem Jahr andere Worte enthalten Sie die folgende regex verwenden können: \ b \ d {4} \ b