Wyrażenie regularne dopasowane do testu przez ważny rok

Biorąc pod uwagę wartość chcę ją zweryfikować, aby sprawdzić, czy jest to ważny rok. Moje kryteria są proste, gdzie wartość powinna być liczbą całkowitą ze znakami 4. Wiem, że nie jest to najlepsze rozwiązanie, ponieważ nie pozwoli na lata przed 1000 i pozwoli na lata takie jak 5000. Kryteria te są odpowiednie dla mojego obecnego scenariusza.

To co wymyśliłem to

\d{4}$

Podczas gdy to działa, pozwala również na wartości ujemne.

Jak zapewnić, że tylko dodatnie liczby całkowite są wolno?

Author: Alexis Tyler, 2010-12-07

13 answers

Musisz dodać anchor start ^ jako:

^\d{4}$

Twój regex \d{4}$ będzie pasował do ciągów , które kończą się 4 cyframi . Tak więc dane wejściowe jak -1234 będą akceptowane.

Dodając kotwicę początkową dopasowujesz tylko te łańcuchy, które rozpoczynają się i kończą z 4 cyframi, co oznacza, że muszą zawierać tylko 4 cyfry.

 60
Author: codaddict,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-07 07:15:29

Lata od 1000 do 2999

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

Dla 1900-2099

^(19|20)\d{2}$
 134
Author: r92,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-07 09:43:15

"przyjęta" odpowiedź na to pytanie jest zarówno Niepoprawna, jak i krótkowzroczna.

Jest niepoprawne, ponieważ będzie pasować do ciągów takich jak 0001, co nie jest ważnym rokiem.

Jest krótkowzroczny, ponieważ nie będzie pasował do wartości powyżej 9999. Czy zapomnieliśmy już o lekcjach Y2K? Zamiast tego użyj wyrażenia regularnego:

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

Jeśli chcesz dopasować lata w przeszłości, oprócz lat w przyszłości, możesz użyć tego wyrażenia regularnego, aby dopasować dowolne dodatnia liczba całkowita:

^[1-9]\d*$

Nawet jeśli nie oczekujesz dat z przeszłości, możesz użyć tego wyrażenia regularnego tak czy inaczej, na wypadek, gdyby ktoś wymyślił wehikuł czasu i chciał zabrać ze sobą Twoje oprogramowanie.

Uwaga: to wyrażenie regularne będzie pasować do wszystkich lat, łącznie z tymi przed rokiem 1, ponieważ są one zazwyczaj reprezentowane z oznaczeniem BC zamiast ujemnej liczby całkowitej. Oczywiście ta konwencja może się zmienić w ciągu najbliższych kilku tysiącleci, więc najlepiej opcją jest dopasowanie dowolnej liczby całkowitej-dodatniej lub ujemnej - z następującym wyrażeniem regularnym:

^-?[1-9]\d*$
 19
Author: sferik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-16 19:27:02

To działa dla 1900 do 2099:

/(?:(?:19|20)[0-9]{2})/
 8
Author: jonschlinkert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-01 09:51:01

W latach 1970-2019 budowano na podstawie odpowiedzi @r92:

(19[789]\d|20[01]\d)
 4
Author: Renaud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-27 09:35:37

Można przejść z sth jak [^-]\d{4}$: zapobiega znak minus - być przed 4 cyfry.
możesz również użyć ^\d{4}$ z ^, aby złapać początek łańcucha. To zależy od Twojego scenariusza...

 1
Author: PierrOz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-07 07:17:30

Teoretycznie opcja 4-cyfrowa jest słuszna. Ale w praktyce może być lepiej mieć zakres 1900-2099.

Dodatkowo musi to być grupa bez przechwytywania. Wiele komentarzy i odpowiedzi proponuje przechwytywanie grup, które nie jest właściwe IMHO. Ponieważ dla dopasowania może działać, ale dla wyodrębniania dopasowań za pomocą regex wyodrębni 4 cyfry i 2 cyfry (19 i 20) również z powodu parantezy.

To zadziała dla dokładnego dopasowania za pomocą Nie-przechwytywania grupy:

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

 1
Author: Adil Aliyev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-16 08:59:11

Można przekonwertować liczbę całkowitą na ciąg znaków. Ponieważ znak minus nie będzie pasował do cyfr, nie będziesz miał ujemnych lat.

 0
Author: Comradin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-22 14:06:46

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

Działa od 1900 do 9999

 0
Author: R2Rivs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-22 06:41:33

/^\d{4}$ / To sprawdzi, czy łańcuch składa się tylko z 4 liczb. W tym scenariuszu, aby wprowadzić rok 989, możesz zamiast tego dać 0989.

 0
Author: Dayz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-18 09:49:38

Aby sprawdzić rok w łańcuchu zawierającym inne słowa wraz z rokiem, możesz użyć następującego wyrażenia regularnego: \b \ d{4}\b

 0
Author: Dhyey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-12 12:43:22

Use;

^(19|[2-9][0-9])\d{2}$ 
W latach 1900-9999.

Nie musisz się martwić o 9999 i następne-A. I. będzie robić całe Programowanie do tego czasu !!! Hehehehe

Możesz przetestować regex w https://regex101.com/

Również więcej informacji o grupach nie przechwytywających ( wymienionych w jednym z komentarzy powyżej ) tutaj http://www.manifold.net/doc/radian/why_do_non-capture_groups_exist_.htm

 0
Author: MarcoZen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-11 09:06:04

Jeśli chcesz dopasować RRRR lub RRRRMMDD możesz użyć:

^((?:(?:(?:(?:(?:[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
Author: Benjamin Goodacre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-19 15:09:52