Geçerli bir yılı test etmek için Normal İfade Eşlemesi


92

Bir değer verildiğinde, geçerli bir yıl olup olmadığını kontrol etmek için doğrulamak istiyorum. Ölçütlerim, değerin 4karakterli bir tam sayı olması gerektiği yerde basittir . Bunun en iyi çözüm olmadığını biliyorum çünkü yıllar öncesine 1000izin vermeyecek ve yıllara da izin verecek 5000. Bu kriter mevcut senaryom için yeterlidir.

Ortaya çıkardığım şey

\d{4}$

Bu çalışırken negatif değerlere de izin verir.

Yalnızca pozitif tam sayılara izin verildiğinden nasıl emin olabilirim?


fwiw Bu aralıkları otomatik olarak oluşturmak için regex aralığı için bir node.js projesi oluşturdum . Bir dizi yıl boyunca test etmek için normal ifadeyi oluşturmanız gerekirse göründüğünden daha zordur.
jonschlinkert

Doğrulamanızı neden 4 basamaklı yıllarla sınırlayasınız? longnow.org
Dan Temple

Yanıtlar:


78

Şu şekilde bir başlangıç ​​bağlantısı eklemeniz gerekir ^:

^\d{4}$

Normal ifadeniz 4 rakamla\d{4}$ biten dizelerle eşleşir . Yani giriş gibi kabul edilecektir.-1234

Başlangıç ​​çapasını ekleyerek yalnızca 4 basamakla başlayan ve biten dizelerle eşleşirsiniz , bu da etkin bir şekilde yalnızca 4 basamak içermeleri gerektiği anlamına gelir.


2
Lanet olsun! Benimki o kadar kusurluydu ki kabul bile ederdi whateverblahblah2323. Şimdi biraz öğrenmenin neden tehlikeli olduğunu anlıyorum: O
Ranhiru Jude Cooray

62
Bu 10.000 yılında kırılacak.
sferik

16
@sferik: Fark etmez. Orijinal afiş özellikle dört karakteri kontrol etmek istediğini belirtti. 10.000 yılının geçerli girdi olmasını istediğini, bu yüzden kabul etmenin 10000bir hata olacağını belirtmedi.
markusk

4
@sferik: Program yüzyıllar boyunca gitmiş olacak. Değilse, gelecekte 9.000 yıl için endişelenmek en iyisidir. YAGNI ilkesine göre yaklaşım geçerlidir.
Phil

183

1000 ile 2999 arası yıllar

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

1900-2099 için

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

14
Bu çok daha iyi bir çözüm
mk_89

10
Yakalamayan grubu kullanmam daha iyi:^(?:19|20)\d{2}$
Eldar Agalarov

2011 ve 2099 arasındaki 4 basamaklı bir yılı nasıl doğrularım?
mcquaim

(19|20)\d{2}Doğum tarihi biçimini doğrulamak için normal ifademe nasıl ekleme yapabilirim ? Bu benim normal /^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/
ifadem


22

Bu sorunun "kabul edilen" yanıtı hem yanlış hem de miyoptur.

0001Geçerli bir yıl olmayan gibi dizelerle eşleşeceği için yanlıştır .

O olacağı miyop olduğunu değil 9999 Yukarıda herhangi bir değer maç zaten unuttu Y2K ? Bunun yerine normal ifadeyi kullanın:

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

Geçmişteki yılları eşleştirmeniz gerekirse, gelecekteki yıllara ek olarak, bu normal ifadeyi herhangi bir pozitif tamsayı ile eşleştirmek için kullanabilirsiniz:

^[1-9]\d*$

Geçmişten tarihler beklemeseniz bile, bu normal ifadeyi yine de kullanmak isteyebilirsiniz, sadece birisinin bir zaman makinesi icat etmesi ve yazılımınızı onlarla geri almak istemesi durumunda.

Not: Bu normal ifade, genellikle negatif bir tamsayı yerine bir BC gösterimi ile temsil edildiğinden, 1. yıldan öncekiler de dahil olmak üzere tüm yıllar eşleşecektir. Elbette, bu kural önümüzdeki birkaç bin yılda değişebilir, bu nedenle en iyi seçeneğiniz herhangi bir tamsayıyı (pozitif veya negatif) aşağıdaki normal ifadeyle eşleştirmektir:

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

3
Hayır, muhtemelen olmayacak. Ancak birisinin (arkeolog? Tarihçi?) 8000 yıl öncesiyle eşleşmesi gerekebilir. : D Ve Doc Brown buna ihtiyaç duyabilir ...
Jaime

1
Bunu 1000-9999 ^ [1-9] \\ d {3} $ thats aralığını sınırlamak için kullandım çünkü veri sağlamamız gereken uygulama yalnızca 4 basamaklı sayıları kabul ediyor :(
MatPag

Harika cevap. 0 yılını da kabul etmeyi şu şekilde yapardım: ^ (-? [1-9] \ d * | 0) $
Kosta Kontos

10

Bu, 1900 ila 2099 için geçerlidir:

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

bana sadece 2099'a gidecekmiş gibi görünüyor. BTW OP sadece pozitif 4 haneli sayıya nasıl izin verileceğini soruyor.
DeanOC

bah, 2099 demek istediğim şey. Teşekkürler. ve şimdi pozitif tamsayılar kısmını görüyorum.
jonschlinkert

Bu aralıkları otomatik olarak oluşturmak için regex aralığı için bir proje oluşturdum
jonschlinkert

5

@ R92 cevabına dayanarak, 1970-2019 yılları için:

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

Cevabınız izin veriyor197999
çığ 1

Sanmıyorum ... Normal ifadenin ilk bölümü 19 ile başlayan sayı, ardından 7,8 veya 9'dan herhangi biri ve ardından TEK bir sayı ile eşleşiyor. Normal ifade 19[789]\d\d\dizin verir197999
Renaud

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

evet, 1970son 4 değil ilk 4 sayı ( ) ile eşleşecek . Peki ya (19[789]\d|20[01]\d)[^0-9]? Bu eşleşir 1970 324ama eşleşmez1970324
Renaud

1
Bunu bir dosya adından film yılını bulmak için yararlı buldum ... bu durumda 1930'lardan itibaren şeyler istiyoruz ... ama sonra video kalitesi için sonuna eklenen 1024'ü hariç
Adrian Hum

2

Yılla birlikte başka kelimeler içeren bir dizede bir yılı test etmek için aşağıdaki normal ifadeyi kullanabilirsiniz: \ b \ d {4} \ b


Bu tam olarak ihtiyacım olan şeydi, kabul edilen cevap geçerli PCRE gibi görünmüyor.
Prometheus

2

Teorik olarak 4 basamaklı seçenek doğrudur. Ancak pratikte 1900-2099 aralığına sahip olmak daha iyi olabilir.

Ek olarak yakalamayan grup olması gerekir. Birçok yorum ve cevap, uygun IMHO olmayan bir gruplamayı önermektedir. Çünkü eşleştirme için işe yarayabilir, ancak normal ifadeyi kullanarak eşleşmeleri ayıklamak için 4 basamaklı sayıları ve iki basamaklı (19 ve 20) sayıları da parantez nedeniyle çıkaracaktır.

Bu, yakalamayan grupları kullanarak tam eşleme için çalışacaktır:

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


1

[gibi bir şeyle gidebilirsiniz ^-]\d{4}$: eksi işaretinin -4 hanenizden önce olmasını engellersiniz . dizenin başlangıcını yakalamak için ile
de kullanabilirsiniz . Aslında senaryonuza bağlı ...^\d{4}$^



0

Tamsayınızı bir dizeye dönüştürebilirsiniz. Eksi işareti rakamlarla eşleşmeyeceğinden, negatif yılınız olmayacak.


0

Bu normal ifadeyi Java'da kullanıyorum ^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$

1900'den 9999'a kadar çalışır


0

/ ^ \ d {4} $ / Bu, bir dizenin yalnızca 4 sayıdan oluşup oluşmadığını kontrol eder. Bu senaryoda, 989 yılını girmek için bunun yerine 0989 verebilirsiniz.


0

YYYY veya YYYYMMDD ile eşleşmeniz gerekiyorsa şunları kullanabilirsiniz:

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

Bunu da kullanabilirsiniz.

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

Sadece yılı eşleştirmek istiyorlar. Üstelik normal ifadeniz 00/00/2000veya 31/02/1999ve daha birçok yanlış tarihle eşleşiyor .
Toto

Size yardımcı olabilir mi? ([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])ay için çok daha iyi bir ifade
EZ-C

0

Benim durumumda, örneğin bir yılla (4 hane) biten bir dizeyi eşleştirmek istedim, örneğin:

Oct 2020
Nov 2020
Dec 2020
Jan 2021

Bununla geri dönecek true:

var sheetName = 'Jan 2021';
var yearRegex = new RegExp("\b\d{4}$");
var isMonthSheet = yearRegex.test(sheetName);
Logger.log('isMonthSheet = ' + isMonthSheet);

Yukarıdaki kod, Apps Komut Dosyasında kullanılır .

Yukarıdaki Regex'i test etmek için bağlantı: https://regex101.com/r/SzYQLN/1


Bu, sadece maç Oct 2020değil Oct 20202, aynı zamandaOct20202
Ranhiru Jude Cooray

@RanhiruJudeCooray normal ifadeyi geliştirdi.
Leniel Maccaferri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.