Vraag Regular Expression Match om te testen voor een geldig jaar


Gezien een waarde wil ik het valideren om te controleren of het een geldig jaar is. Mijn criteria zijn eenvoudig als de waarde een geheel getal moet zijn met 4 karakters. Ik weet dat dit niet de beste oplossing is, omdat het jaren eerder niet mogelijk zal zijn 1000 en zal jaren zoals toestaan 5000. Dit criterium is voldoende voor mijn huidige scenario.

Wat ik bedacht is

\d{4}$

Terwijl dit werkt, staat het ook negatieve waarden toe.

Hoe zorg ik ervoor dat alleen positieve gehele getallen worden toegestaan?


56
2017-12-07 07:13


oorsprong


antwoorden:


U moet een startanker toevoegen ^ als:

^\d{4}$

Je regex \d{4}$ komt overeen met strings dat eindigt met 4 cijfers. Dus invoer zoals -1234 zal worden aanvaard.

Door het startanker toe te voegen, stem je alleen die strings overeen begin en einde met 4 cijfers, wat betekent dat ze slechts 4 cijfers mogen bevatten.


59
2017-12-07 07:15



Jaar van 1000 tot 2999

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

Voor 1900-2099

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

132
2017-12-07 07:18



Het "geaccepteerde" antwoord op deze vraag is zowel onjuist als kortzichtig.

Het is onjuist omdat het overeenkomt met tekenreeksen zoals 0001, wat geen geldig jaar is.

Het is kortzichtig in dat het zal niet overeenkomen met waarden boven 9999. Zijn we de lessen van. al vergeten? Y2K? Gebruik in plaats daarvan de reguliere expressie:

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

Als u jaren in het verleden moet matchen, naast jaren in de toekomst, kunt u deze reguliere expressie gebruiken om elk positief geheel getal te evenaren:

^[1-9]\d*$

Zelfs als je geen datums uit het verleden verwacht, wil je deze reguliere expressie misschien toch gebruiken, voor het geval iemand een tijdmachine uitvindt en je software mee terug wilt nemen.

Opmerking: deze reguliere expressie komt overeen met alle jaren, inclusief die vóór het jaar 1, omdat ze meestal worden weergegeven met een BC-aanduiding in plaats van een negatief geheel getal. Uiteraard kan deze conventie in de komende millennia veranderen, dus je beste optie is om een ​​geheel-positief of negatief-overeen te komen met de volgende reguliere expressie:

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

17
2017-09-03 00:34



Dit werkt voor 1900 tot 2099:

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

8
2018-02-01 07:44



Voortbouwend op @ r92 antwoord, voor de jaren 1970-2019:

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

4
2018-06-27 09:35



je kunt gaan met sth zoals [^-]\d{4}$: je voorkomt het minteken - om voor je 4 cijfers te staan.
je kan ook gebruiken ^\d{4}$ met ^ om het begin van de string te vangen. Het hangt eigenlijk af van je scenario ...


1
2017-12-07 07:17



In theorie heeft de 4-cijferige optie gelijk. Maar in de praktijk is het misschien beter om 1900-2099 bereik te hebben.

Bovendien moet het een niet-vastleggende groep zijn. Veel opmerkingen en antwoorden stellen voor dat een groepering wordt vastgelegd die niet de juiste IMHO is. Omdat het matchen kan werken, maar voor het extraheren van overeenkomsten met behulp van regex, zal het viercijferige getallen en tweecijferige (19 en 20) getallen extraheren, ook vanwege paranthesis.

Dit werkt voor exact matchen met niet-vastleggende groepen:

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


1
2018-04-16 08:59



Je zou je integer kunnen omzetten in een string. Omdat het minteken niet overeenkomt met de cijfers, hebt u geen negatieve jaren.


0
2017-12-07 07:19



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

Werkt van 1900 tot 9999


0
2018-01-22 06:41



/ ^ \ D {4} $ / Hiermee wordt gecontroleerd of een reeks uit slechts 4 cijfers bestaat. In dit scenario kunt u in plaats van 0989 een jaar 989 invoeren.


0
2018-04-18 09:49