Regular Expression Match da testare per un anno valido


89

Dato un valore voglio convalidarlo per verificare se è un anno valido. I miei criteri sono semplici in cui il valore dovrebbe essere un numero intero con 4caratteri. So che questa non è la soluzione migliore in quanto non consentirà anni prima 1000e consentirà anni come 5000. Questo criterio è adeguato per il mio scenario attuale.

Quello che mi è venuto in mente è

\d{4}$

Sebbene funzioni, consente anche valori negativi.

Come posso assicurarmi che siano consentiti solo numeri interi positivi?


fwiw ho creato un progetto node.js, to-regex-range per creare automaticamente questi intervalli. È più difficile di quanto potrebbe sembrare se è necessario generare la regex da testare per un intervallo di anni.
jonschlinkert

Perché limitare la convalida a 4 cifre anni? longnow.org
Tempio di Dan,

Risposte:


76

Devi aggiungere un'ancora di partenza ^come:

^\d{4}$

La tua regex abbinerà \d{4}$le stringhe che finiscono con 4 cifre . Quindi -1234verranno accettati input simili .

Aggiungendo l'ancora di inizio si abbinano solo le stringhe che iniziano e finiscono con 4 cifre, il che significa che devono contenere solo 4 cifre.


2
Dannazione! Il mio era così imperfetto che avrebbe persino accettato whateverblahblah2323. Ora capisco perché un po 'di apprendimento è pericoloso: O
Ranhiru Jude Cooray

62
Questo interromperà nell'anno 10.000.
sferik

16
@sferik: non importa. Il poster originale affermava espressamente che voleva controllare quattro personaggi. Non ha dichiarato di volere che l'anno 10.000 fosse un input valido, quindi accettare 10000sarebbe un bug.
markusk

4
@sferik: Il programma finirà per secoli da allora. In caso contrario, è meglio preoccuparsi di circa 9.000 anni nel futuro. Seguendo il principio di YAGNI, l'approccio è valido.
Phil

182

Anni dal 1000 al 2999

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

Per 1900-2099

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

14
Questa è una soluzione molto migliore
mk_89

10
È meglio usare il gruppo che non cattura:^(?:19|20)\d{2}$
Eldar Agalarov

Come convalido un anno a 4 cifre tra il 2011 e il 2099?
mcquaim

Come posso aggiungere (19|20)\d{2}alla mia regex per convalidare un formato di data di nascita? Questa è la mia regex, /^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/voglio assicurarmi che l'anno abbia sempre 4 cifre e inizi con 19 ** o 20 **
ltdev

Usa ^ (19 | 2 [0-9]) \ d {2} $ per gli anni 1900 - 2999
MarcoZen

22

La risposta "accettata" a questa domanda è sia errata che miope.

Non è corretto in quanto corrisponderà a stringhe come 0001, che non è un anno valido.

È miope in quanto non corrisponderà a nessun valore superiore a 9999. Abbiamo già dimenticato le lezioni di Y2K ? Utilizza invece l'espressione regolare:

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

Se è necessario abbinare gli anni nel passato, oltre agli anni nel futuro, è possibile utilizzare questa espressione regolare per trovare qualsiasi numero intero positivo:

^[1-9]\d*$

Anche se non ti aspetti date dal passato, potresti comunque voler usare questa espressione regolare, nel caso in cui qualcuno inventi una macchina del tempo e voglia riportare con sé il tuo software.

Nota: questa espressione regolare corrisponderà a tutti gli anni, inclusi quelli precedenti all'anno 1, poiché sono tipicamente rappresentati con una designazione BC invece di un numero intero negativo. Ovviamente, questa convenzione potrebbe cambiare nei prossimi millenni, quindi l'opzione migliore è quella di abbinare qualsiasi numero intero, positivo o negativo, con la seguente espressione regolare:

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

3
No, probabilmente non lo farà. Ma qualcuno (archeologo? Storico?) Potrebbe aver bisogno di abbinare anni per 8000 anni fa. : D E Doc Brown potrebbe averne bisogno ...
Jaime

1
L'ho usato per limitare l'intervallo da 1000-9999 ^ [1-9] \\ d {3} $ questo perché l'applicazione a cui dobbiamo fornire i dati accetta solo numeri a 4 cifre :(
MatPag

Ottima risposta. Farei quanto segue per accettare anche l'anno 0: ^ (-? [1-9] \ d * | 0) $
Kosta Kontos

10

Funziona dal 1900 al 2099:

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

mi sembra che andrebbe solo al 2099. A proposito, l'OP chiede come consentire solo un numero positivo a 4 cifre.
DeanOC

bah, 2099 è quello che volevo dire. Grazie. e ora vedo la parte degli interi positivi.
jonschlinkert

Ho creato un progetto, to-regex-range per creare automaticamente questi intervalli
jonschlinkert

5

Basandosi sulla risposta @ r92, per gli anni 1970-2019:

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

La tua risposta lo consente197999
avalanche1

Non credo che lo faccia ... La prima parte della regex corrisponde al numero che inizia con 19, quindi uno qualsiasi di 7,8 o 9, seguito da un numero SINGOLO. L'espressione regolare 19[789]\d\d\dconsentirebbe197999
Renaud

1
/(19[789]\d|20[01]\d)/.test(1970324) >> true
valanga1

sì, corrisponderà ai primi 4 numeri ( 1970), non agli ultimi 3. Di cosa si tratta (19[789]\d|20[01]\d)[^0-9]? Ciò corrisponderebbe 1970 324ma non1970324
Renaud

1
Ho trovato questo utile per trovare l'anno del film da un nome di file ... in questo caso vogliamo cose dagli anni '30 in poi ... ma poi escludiamo il 1024 che viene aggiunto alla fine per la qualità del video
Adrian Hum

2

In teoria l'opzione a 4 cifre è giusta. Ma in pratica potrebbe essere meglio avere un range 1900-2099.

Inoltre, deve essere un gruppo non di acquisizione. Molti commenti e risposte propongono di catturare il raggruppamento che non è corretto IMHO. Perché per la corrispondenza potrebbe funzionare, ma per l'estrazione di corrispondenze utilizzando regex estrarrà numeri a 4 cifre e numeri a due cifre (19 e 20) anche a causa della parentesi.

Funzionerà per la corrispondenza esatta utilizzando gruppi non di acquisizione:

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


1

puoi andare con qc come [ ^-]\d{4}$: impedisci che il segno meno -sia prima delle tue 4 cifre.
puoi anche usare ^\d{4}$con ^per catturare l'inizio della stringa. Dipende dal tuo scenario in realtà ...


1

Per testare un anno in una stringa che contiene altre parole insieme all'anno puoi usare la seguente regex: \ b \ d {4} \ b


Questo era esattamente ciò di cui avevo bisogno, la risposta accettata non sembra essere PCRE valida.
Prometeo


0

Potresti convertire il tuo numero intero in una stringa. Poiché il segno meno non corrisponderà alle cifre, non avrai anni negativi.


0

Uso questa regex in Java ^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$

Funziona dal 1900 al 9999


0

/ ^ \ d {4} $ / Questo controllerà se una stringa è composta da soli 4 numeri. In questo scenario, per inserire un anno 989, puoi invece dare 0989.


0

Se devi abbinare AAAA o AAAAMMGG puoi utilizzare:

^((?:(?:(?:(?:(?:[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

Puoi anche usare questo.

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

Vogliono abbinare solo l'anno. Inoltre le partite regex 00/00/2000o 31/02/1999e molti più falsi date.
Toto

Potrebbe aiutarti ([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])è un'espressione molto migliore per il mese
EZ-C
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.