2010-10-15 14 views
8

Bir RegEx eşleşmesinin MM/YY veya AA/YYYY biçimini bulmasına veya sahip olmanıza yardımcı olması gerekir. RegExFu'm zayıf ve bunu yazmaya nereden başlayacağımı bile bilmiyorum.M/YYYY, AA/YYYY, M/YY veya AA/YY biçimlerini eşleştirmek için RegEx

Aylar 1-12 yıl olmalıdır, 2009'un ötesinde bir şey geçerli olmalıdır. Daha önce daha fazla detay bahsetmediğim için üzgünüm. Bu bir son kullanma tarihi olarak kullanılır.

Yukarıda ve öteye gidenler için bir ödül ekleyeceğim ve bugünkü tarih olan MM/YY veya AA/YYYY biçimini onaylayacağım. İlk doğrulama katmanını geçecek bir süre dolduran bir şey yok. Benim gereksinimleri değişti ve ben orta soruyu gerekeni daha spesifik olmak zorunda çünkü


Çok kötüyüm ben olacak bir kere pencere sona no-ödül cevap herkese ödül bounties.

+0

Onları denemek için http://weitz.de/regex-coach/ bir öğretici için http://www.regular-expressions.info/ mi olacak: Ben küçük bir iyileşme önerebilir. (\ d \ d)/(\ d \ d) mm/yy için bir başlangıçtır. Sry, şu an için çok tembelim. – gimpf

+0

Kullanıcıların '2 basamaklı yıl' girmesine izin vermeyi planlıyorsanız, bunu önermiyorum. Her zaman "4 basamak" (tam rakam) tercih et. – BrunoLM

+0

@BrunoLM, iyi çalıştığım API ile MM/YY formatını kabul ediyorum, bu yüzden kullanacağım kullanıcılara verebileceğim ufak bir perk. – jfar

cevap

11

Ne

// 10 to 12 | 01 to 09 | 1 to 9 
(1[0-2]|0[1-9]|\d) 
ay Maçlar
^(1[0-2]|0[1-9]|\d)\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)$ 

hakkındaVe yıllar

// 2000 to 2099 | 1900 to 1999 
// 01 to 09 | 10 to 99 
(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d) 

için herşeyi >= 2010

/^(1[0-2]|0[1-9]|\d)\/([2-9]\d[1-9]\d|[1-9]\d)$/; 

Sonucu eşleştirmek için:

12/2009 : false 
1/2010 : true 
12/2011 : true 
12/9011 : true 
12/07 : false 
12/17 : true 
+0

@Bruno, temelde cevabım bu. – Brad

+1

'00' yılını hariç tutmanın bir nedeni var mı? Bu muhtemelen kafa karıştırıcı olduğu için kullanmak için iyi bir uygulama değil, ama hala geçerli gibi görünüyor. Ya da C# tarih biçimleri için buna izin vermiyor mu? – eldarerathis

+0

@eldarerathis: OP, beklediği aralıkları söylemedi. 00'ı hariç tutmaya karar verdim çünkü bana göre belirsiz görünüyor. '00' 1900' veya 2000’dir? Her neyse, bu sadece bir örnektir. Önerdiğim her zaman 4 haneli kullanmaktır. – BrunoLM

4

bu deneyin:

^(0[1-9]|1[0-2])/(19|2[0-1])\d{2}$ 

fiili ay (1-12) ve yıllar 1900-2199 için sınırlandırır.

+0

Hhm ne hakkında 10/100: /? –

+0

bu "MM/YYY" ile eşleşir. –

+0

@klausbyskov, Daha hassas bir şekilde güncelledim. – Brad

5

Dene:

var re = new Regex(@"(?<month>\d{2})/(?<year>\d{2}|\d{4})"); 
var month = re.Match(yourString).Groups["month"]; 
... 

bir alternatiftir:

if(dateStr.Length == 5) 
    myDateTime = DateTime.ParseExact("MM/YY", dateStr); 
else 
    myDateTime = DateTime.ParseExact("MM/YYYY", dateStr); 
+0

bu ayın 54 olmasını sağlar. – Brad

+0

ParseExact'i işaretlediğiniz için teşekkürler. Bu benim validasyonumu daha da iyi yapar. – jfar

+0

[ParseExact] (http://msdn.microsoft.com/en-us/library/332de853.aspx), bir regex'ten daha iyi bir biçimde daha iyi biçimler alabilir. – Kobi

0

@BrunoLM,

^(1[0-2]|0[1-9]|\d)\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)$ 

"0/2009" ile eşleşir.

^(1[0-2]|0[1-9]|[1-9])\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)$ 
İlgili konular