2010-09-22 15 views
5

के लिए एक reg अभिव्यक्ति के बारे में पता है हाय क्या कोई भी किसी यूके दिनांक प्रारूप के लिए reg ex को जानता है उदा। dd/mm/yyyy।क्या किसी को ब्रिटेन दिनांक प्रारूप

डीडी या मिमी 1 वर्ण हो सकता है उदा। 1/1/2010 लेकिन वर्ष हमेशा 4 अक्षर होना चाहिए।

अग्रिम

+0

परीक्षण करना चाहते हैं कौन सी भाषा इस के लिए है? – codaddict

+0

@ कोडडिक्ट, नियमित अभिव्यक्ति अधिकांश भाग के लिए भाषा तटस्थ हैं। –

+0

कई प्रोग्रामिंग भाषाओं में किसी भी प्रारूप में तारीख को पार्स करने के लिए सही कार्य होते हैं और एक महीने के भीतर दिनों की संख्या का ख्याल रखते हैं, लीप साल इत्यादि। – eumiro

उत्तर

11
^\d{1,2}/\d{1,2}/\d{4}$ 

धन्यवाद 1.1.2000, 1999/7/5, लेकिन यह भी 99/77/8765 से मेल खाएगी।

तो अगर आप कुछ मौलिक दिखावट जाँच करना चाहते हैं, आप की जरूरत

^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/\d{4}$ 

यह अभी भी 31/02/9999 से मेल खाएगी, इसलिए यदि आप उन को पकड़ने के लिए चाहते हैं, यह hairier हो रही है:

^(?:(?:[12][0-9]|0?[1-9])/0?2|(?:30|[12][0-9]|0?[1-9])/(?:0?[469]|11)|(?:3[01]|[12][0-9]|0?[1-9])/(?:0?[13578]|1[02]))/\d{4}$ 

लेकिन यह अभी भी लीप वर्षों को पकड़ नहीं पाएगा। तो, a beast of a regex from regexlib.com संशोधित:

^(?:(?:(?:(?:31\/(?:0?[13578]|1[02]))|(?:(?:29|30)\/(?:0?[13-9]|1[0-2])))\/(?:1[6-9]|[2-9]\d)\d{2})|(?:29\/0?2\/(?:(?:(1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:0?[1-9]|1\d|2[0-8])\/(?:(?:0?[1-9])|(?:1[0-2]))\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$ 

1/1/2001 
31/5/2010 
29/02/2000 
29/2/2400 
23/5/1671 
01/1/9000 

से मेल खाते हैं और

31/2/2000 
31/6/1800 
12/12/90 
29/2/2100 
33/3/3333 

असफल हो जायेगी कुल मिलाकर, नियमित अभिव्यक्ति दिनांकों मिलान करने में सक्षम हो सकता है; उन्हें मान्य करना उनके फोर्टे नहीं है, लेकिन यदि वे सभी आप उपयोग कर सकते हैं, तो यह निश्चित रूप से संभव है। लेकिन भयानक लग रहा है :)

+2

यह आमतौर पर बेहतर होता है, एक बार जब आप संभावित मिलान प्राप्त कर लेते हैं, तो इसे एक चर के रूप में भरने के लिए टाइप डेट (प्लेटफॉर्म पर जो कुछ भी हो), और प्लेटफॉर्म को लीप वर्ष नियमों आदि के बारे में चिंता करने दें। –

+0

पहला 0 वैकल्पिक नहीं है, इसे '?' –

+1

के साथ प्रत्ययित करें या तो इसे सरल रखें, या अभिव्यक्ति के लिए वेब पर खोजें जो लीप वर्षों सहित सबकुछ संभालता है। अगर यह अभी भी सभी मामलों को संभाल नहीं सकता है तो एक और जटिल अभिव्यक्ति बनाने के लिए वास्तव में कोई बात नहीं है। – Guffa

1
\b(0?[1-9]|[12][0-9]|3[01])[/](0?[1-9]|1[012])[/](19|20)?[0-9]{2}\b 

मैच:

  • 2010/01/01
  • 2010/01/01

लेकिन भी इस तरह के फरवरी 31 वें के रूप में अमान्य तिथियां

+0

मुझे लगता है कि एक महीने में सही दिन मिलान करना फरार और लीप साल से मेल नहीं खाता है;) इसके अलावा कि, यह फ़ॉर्म से मेल खाने और मूल्यों से मेल खाने के बीच एक अंतर है। –

0

^\d{1,2}/\d{1,2}/\d{4}$

ब्रेसिज़ में न्यूनतम और अधिकतम चार गिनती है। \d का मतलब है अंक, ^ प्रारंभ, और $ स्ट्रिंग के अंत।

4

Regex इस नौकरी के लिए सही उपकरण नहीं है।

वैध दिनांक से मेल खाने के लिए रेगेक्स के साथ आने के लिए यह बहुत मुश्किल है (लेकिन संभव है)। फरवरी को सुनिश्चित करने की तरह चीजें 29 दिन लीप वर्ष पर हैं और सामान regex में आसानी से करने योग्य नहीं है।

इसके बजाय जांचें कि क्या आपकी भाषा लाइब्रेरी तिथियों को सत्यापित करने के लिए कोई फ़ंक्शन प्रदान करती है।

पीएचपी ऐसे ही एक समारोह checkdate कहा जाता है:

bool checkdate (int $month , int $day , int $year) 
0
\b(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d 

यह अभ्यस्त तारीख को मान्य है, लेकिन आप प्रारूप

0

मैं इसी तरह की आवश्यकताओं में भाग के लिए देख सकते हैं। यहां लीप वर्ष सत्यापन के साथ पूर्ण नियमित अभिव्यक्ति है। प्रारूप: डीडी/एमएम/yyyy

(3 [01] | [12] \ डी | 0 [1-9])/(0 [13578] | 10 | 12)/((?! 0000) \ घ {4}) | (30 | [12] \ घ | 0 [1-9])/(0 [469] | 11)/((?! 0000) \ घ {4}) | (2 [0- 8] | [01] \ घ | 0 [1-9])/(02)/((0000 ?!) \ घ {4}) | 2 9/(02)/(1600 | 2000 | 2400 | 2800 | 00) | 2 9/(02)/(\ डी \ डी) (0 [48] | [2468] [048] | [13579] [26])

इसे आसानी से यूएस प्रारूप या अन्य यूरोपीय प्रारूपों में संशोधित किया जा सकता है।

संपादित:

(3 [01] | [12] \ घ | 0 [1-9])/(0 [13578] | 10 | 12)/((?! 0000) \ घ {4}) | (30 | [12] \ घ | 0 [1-9])/(0 [469] | 11)/((?! 0000) \ घ {4}) | (2 [0- 8] | [01] \ घ | 0 [1-9])/(02)/((0000 ?!) \ घ {4}) | 29/(02)/(1600 | 2000 | 2400 | 2800 | 00) | 2 9/(02)/(\ d \ d) (0 [48] | [2468] [048] | [13579] [26])

+0

2 9/02/2000 के लिए विफल रहता है।सदी के वर्षों 1600 और 2000 लीप साल हैं, लेकिन सदी के वर्षों 1700, 1800, और 1 9 00 – Leo

+0

तय नहीं हैं - 2 9 से पहले अंतरिक्ष को हटा दें। मैंने मूल संपादित किया है। – Leo

0

दो चीजें हैं जो आप करना चाहते हैं, जो मेरे देखें सबसे अच्छी तरह से

1) आप यह सुनिश्चित करना चाहते हैं कि तिथि वास्तविक, वास्तविक तिथि है। उदाहरण के लिए 201 9-02-29 वास्तविक तिथि नहीं है जबकि 2020-02-29 एक वास्तविक तारीख है क्योंकि 2020 एक लीप वर्ष

2) आप यह जांचना चाहते हैं कि तिथि सही प्रारूप में है (इसलिए डीडी/एमएम/yyyy)

दूसरे बिंदु को सरल रेगेक्स के साथ आसानी से पर्याप्त किया जा सकता है, इसके बहुत सारे उदाहरण।

मामलों को जटिल करने के लिए, यदि आप फ़ायरफ़ॉक्स से पूछें तो 201 9-02-29 वास्तविक तिथि है, तो यह नाएन वापस आ जाएगी, जो आप उम्मीद करेंगे।

क्रोम, पर दूसरी ओर कहेंगे कि यह एक वास्तविक तिथि है और आप वापस मार्च 2019 के 1 दे - जो

क्रोम मान्य करेगा, यह भी एक उचित तिथि के रूप में एक अंक की संख्या भी कुछ के लिए स्वीकार करेंगे अजीब कारण, इसे "2" खिलाएं और यह आपको 2001 से पूर्ण तिथि देगा - जो

मान्य करेगा, तो पहला चरण एक ऐसा फ़ंक्शन बनाना है जो किसी दिनांक को समझने का प्रयास करता है (स्वरूप चाहे कोई फर्क नहीं पड़ता) और क्रॉस क्रॉस करता है -ब्रोसर एक बूलियन लौटने के लिए इंगित करता है कि दिनांक वैध है या नहीं

function validatableDate(value) 
{ 
    Date.prototype.isValid = function() 
    { // An invalid date object returns NaN for getTime() and NaN is the only 
     // object not strictly equal to itself. 
     return this.getTime() === this.getTime(); 
    }; 
    minTwoDigits = function(n) 
    { //pads any digit less than 10 with a leading 0 
     return (parseInt(n) < 10 ? '0' : '') + parseInt(n); 
    } 
    var valid_date = false; 
    var iso_array = null; 
    // check if there are date dividers (gets around chrome allowing single digit numbers) 
    if ((value.indexOf('/') != -1) || (value.indexOf('-') != -1)) { //if we're dealing with - dividers we'll do some pre-processing and swap them out for/
     if (value.indexOf('-') != -1) { 
      dash_parts = value.split('-'); 
      value = dash_parts.join("/"); 
      //if we have a leading year, we'll put it at the end and work things out from there 
      if (dash_parts[0].length > 2) { 
       value = dash_parts[1] + '/' + dash_parts[2] + '/' + dash_parts[0]; 
      } 
     } 

     parts = value.split('/'); 
     if (parts[0] > 12) { //convert to ISO from UK dd/mm/yyyy format 
      iso_array = [parts[2], minTwoDigits(parts[1]), minTwoDigits(parts[0])] 
     } else if (parts[1] > 12) { //convert to ISO from American mm/dd/yyyy format             
      iso_array = [parts[2], minTwoDigits(parts[0]), minTwoDigits(parts[1])] 
     } else //if a date is valid in either UK or US (e.g. 12/12/2017 , 10/10/2017) then we don't particularly care what format it is in - it's valid regardless 
     { 
      iso_array = [parts[2], minTwoDigits(parts[0]), minTwoDigits(parts[1])] 
     } 

     if (Array.isArray(iso_array)) { 
      value = iso_array.join("-"); 
      var d = new Date(value + 'T00:00:01Z'); 
      if (d.isValid()) //test if it is a valid date (there are issues with this in Chrome with Feb) 
      { 
       valid_date = true; 
      } 
      //if the month is Feb we need to do another step to cope with Chrome peculiarities 
      if (parseInt(iso_array[1]) == 2) { 
       month_info = new Date(iso_array[0], iso_array[1], 0); 
       //if the day inputed is larger than the last day of the February in that year 
       if (iso_array[2] > month_info.getDate()) { 
        valid_date = false; 
       } 
      } 
     } 
    } 
    return valid_date; 
} 

function validatableDate(t) { 
    Date.prototype.isValid = function() { 
     return this.getTime() === this.getTime() 
    }, minTwoDigits = function (t) { 
     return (parseInt(t) < 10 ? "0" : "") + parseInt(t) 
    }; 
    var a = !1, 
     i = null; 
    return -1 == t.indexOf("/") && -1 == t.indexOf("-") || (-1 != t.indexOf("-") && (dash_parts = t.split("-"), t = dash_parts.join("/"), dash_parts[0].length > 2 && (t = dash_parts[1] + "/" + dash_parts[2] + "/" + dash_parts[0])), parts = t.split("/"), i = parts[0] > 12 ? [parts[2], minTwoDigits(parts[1]), minTwoDigits(parts[0])] : (parts[1], [parts[2], minTwoDigits(parts[0]), minTwoDigits(parts[1])]), Array.isArray(i) && (t = i.join("-"), new Date(t + "T00:00:01Z").isValid() && (a = !0), 2 == parseInt(i[1]) && (month_info = new Date(i[0], i[1], 0), i[2] > month_info.getDate() && (a = !1)))), a 
} 

के लिए कि क्या तारीख या मान्य किया जा सकता है नहीं और इसे पढ़ा जाएगा & स्वरूपों में दिनांक समझने

  • yyyy के रूप में आप एक क्रॉस-ब्राउज़र परीक्षण हो जाता है यही कारण है कि करने के लिए नीचे संकुचित किया जा सकता है कि -mm-dd
  • dd-mm-yyyy
  • mm-dd-yyyy
  • dd/mm/yyyy
  • मिमी/डीडी/yyyy

एक बार जब आप तारीख को मान्य कर लेते हैं तो एक असली, उचित है, तो आप एक रेगेक्स के साथ प्रारूप का परीक्षण कर सकते हैं। तो ब्रिटेन dd/mm/yy

function dateUK(value) { 
    valid_uk_date=false; 
    valid_date=validatableDate(value); 
    if(valid_date && value.match(/^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/]\d{4}$/)) 
    { valid_uk_date=true; 
    } 
    return valid_uk_date;    
} 

के लिए फिर आप जानते हैं कि तारीख एक असली एक है और इसके सही स्वरूप में नहीं है कि।

yyyy-mm-dd प्रारूप के लिए, तुम क्या चाहते हैं:

function dateISO(value) { 
    valid_iso_date=false; 
    valid_date=validatableDate(value); 
    if(valid_date && value.match(/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/)) 
    { valid_iso_date=true; 
    } 
    return valid_iso_date;    
} 

यह निर्भर करता है कि कैसे पूरी तरह से आप निश्चित रूप से होना चाहता हूँ, प्रारूप विवेक का एक मोटा जांच के लिए एक रेगुलर एक्सप्रेशन से अपने उद्देश्यों के लिए पर्याप्त हो सकता है । यदि फिर भी आप अगर तिथि एक असली एक है और अगर प्रारूप मान्य है तो यह उम्मीद है कि रास्ते बिंदु तुम्हारी मदद करेगा

धन्यवाद

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