2010-10-15 16 views
8

से मेल खाने के लिए रेगेक्स एक एमएम/वाई वाई या एमएम/वाई वाई वाई प्रारूप से रेगेक्स मैच खोजने में मदद की ज़रूरत है। मेरा RegExFu कमजोर है और मुझे यह भी यकीन नहीं है कि यह कहां लिखना शुरू करें।एमई/वाईवाईवाई, एमएम/वाई वाई वाईवाई, एम/वाई वाई या एमएम/वाई वाई प्रारूप

महीने 1-12, साल होना चाहिए, 200 9 से अधिक कुछ भी वैध होना चाहिए। पहले अधिक जानकारी का जिक्र नहीं करने के लिए खेद है। इसका उपयोग समाप्ति तिथि के रूप में किया जाता है।

जो भी ऊपर और परे जाता है उसके लिए मैं एक बक्षीस जोड़ूंगा और एमएम/वाई वाई या एमएम/वाईवायवाई प्रारूप को मान्य करता हूं जो कि = आज की तारीख है। पहली मान्यता परत से पहले समाप्त होने वाली सामग्री को देने का कोई मतलब नहीं है।


मैं के बाद से मैं अपने आवश्यकताओं बदल गया है और क्या मैं मध्य सवाल की जरूरत में और अधिक विशिष्ट होना ही था बुरा लग रहा है तो मैं हूँ उन सभी जो एक बार कोई इनाम खिड़की समाप्त हो रहा है जवाब के लिए पुरस्कार इनाम।

+0

आपको ट्यूटोरियल के लिए http://www.regular-expressions.info/ और http://weitz.de/regex-coach/ को उनकी कोशिश करने के लिए पसंद आएगा। (\ d \ d)/(\ d \ d) mm/yy की शुरुआत है। श्रीमान, मैं वर्तमान में बाकी के लिए बहुत आलसी हूँ। – gimpf

+0

यदि आप उपयोगकर्ताओं को '2 अंकों के वर्षों' इनपुट करने की अनुमति देने की योजना बना रहे हैं, तो मैं इसकी अनुशंसा नहीं करता हूं। हमेशा '4 अंक '(पूर्ण अंक) पसंद करें। – BrunoLM

+0

@ ब्रूनोएलएम, अच्छी तरह से एपीआई जो मैं काम कर रहा हूं एमएम/वाई वाई प्रारूप स्वीकार करता हूं, इसलिए मैं अपने उपयोगकर्ताओं को जो कुछ भी ले सकता हूं, वह मैं ले सकता हूं। – jfar

उत्तर

11

के बारे में क्या
^(1[0-2]|0[1-9]|\d)\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)$ 

मैचों महीने

// 10 to 12 | 01 to 09 | 1 to 9 
(1[0-2]|0[1-9]|\d) 

और साल

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

कुछ भी मिलान करने के लिए >= 2010

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

परिणाम:

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

@ ब्रूनो, यह मूल रूप से मेरा जवाब है। – Brad

+1

क्या कोई कारण है कि आप वर्ष '00' को छोड़ रहे हैं? यह संभवतः उपयोग करने के लिए अच्छा अभ्यास नहीं है क्योंकि यह भ्रमित है, लेकिन ऐसा लगता है कि यह अभी भी पूरी तरह मान्य है। या सी # तारीख प्रारूपों के लिए अनुमति नहीं देता है? – eldarerathis

+0

@eldarerathis: ओपी ने यह नहीं कहा कि वह किस सीमा की अपेक्षा कर रहा है। मैंने '00' को बाहर करने का फैसला किया क्योंकि यह मेरे लिए संदिग्ध लगता है। '00'' 1 9 00' या '2000' है? वैसे भी, यह सिर्फ एक उदाहरण है। मैं जो सलाह देता हूं वह हमेशा '4 अंक' का उपयोग करना है। – BrunoLM

4

इस प्रयास करें:

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

वास्तविक महीने (1-12) और वर्ष 1900-2199 तक रोकें।

+0

हम्म 10/100 के बारे में क्या है: /? –

+0

यह "एमएम/वाई वाईवाई" के साथ मेल खाता है। –

+0

@klausbyskov, मैंने इसे और अधिक सटीक होने के लिए अद्यतन किया है। – Brad

5

प्रयास करें:

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

एक वैकल्पिक है:

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

यह महीने 54 होने की अनुमति देता है। – Brad

+0

ParseExact को इंगित करने के लिए धन्यवाद। इससे मेरा सत्यापन भी बेहतर हो जाता है। – jfar

+0

[ParseExact] (http://msdn.microsoft.com/en-us/library/332de853.aspx) स्वरूपों की एक सरणी ले सकता है, जो रेगेक्स से काफी बेहतर है। – Kobi

0

@BrunoLM,

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

"0/2009" से मेल खाता है। क्या मैं एक मामूली सुधार का सुझाव दे सकता हूं:

^(1[0-2]|0[1-9]|[1-9])\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)$ 
संबंधित मुद्दे

 संबंधित मुद्दे