2009-06-29 20 views
5

मैं रेगुलर एक्सप्रेशन की जरूरत है प्रारूप का एक टाइमस्टैम्प मान्य करने के लिए, जावास्क्रिप्ट का उपयोग कर प्रमाणित करने के लिए कुछ खाना पकाने की कोशिश की, लेकिन लगता है कि मेरे regex कौशल कुछ या अन्य को कवर करने में विफल रहता है।नियमित अभिव्यक्ति एक टाइमस्टैम्प

कृपया मुझे ऐसा करने का संदर्भ या तरीका दें।

पीएस : मैं रेगेक्स का उल्लेख करता हूं, केवल एक सुझाव के रूप में। मैं जावास्क्रिप्ट का उपयोग कर रहा हूं और किसी भी विकल्प का स्वागत करता हूं।

+7

2009/14/35 27:63:60 मान्य है? यदि नहीं, तो यह regexes के साथ बदसूरत होने जा रहा है। – balpha

+0

आप किस भाषा का उपयोग कर रहे हैं? यदि यह पर्ल है, तो आप रेगेक्स से कोड का आह्वान कर सकते हैं, जो शायद एकमात्र तरीका है जिसे आप आसानी से पढ़ सकते हैं। यह सत्यापित करने के लिए कोड कि क्या यह एक लीप वर्ष है, यह सत्यापित करने के लिए कि 2 9 फरवरी मौजूद है या नहीं, यह सब कुछ बदसूरत हो जाएगा। –

+0

मैं रेगेक्स का उल्लेख करता हूं, केवल एक सुझाव के रूप में। मैं जावास्क्रिप्ट का उपयोग कर रहा हूं और किसी भी विकल्प का स्वागत करता हूं। –

उत्तर

16

मैं इस के लिए Datejs का उपयोग करने की सलाह दूंगा। तारीख को पार्स करना आवश्यक नहीं है और रेगेक्स टाइमस्टैम्प को सत्यापित करने के लिए पर्याप्त नहीं है। datejs के साथ आप एक तारीख में स्ट्रिंग पार्स सकता है और यदि आप शून्य मिल जाएगा अगर इसकी अमान्य:

Date.parse("2009/06/29 13:30:10", "yyyy/MM/dd HH:mm:ss"); 
+0

धन्यवाद! यह वही करता है जो मुझे चाहिए। –

0

perl शैली: [12] \ d {3}/[01] \ d/[0-3] \ d [0-2] \ d (? :: [0-5] \ d) { 2}

+0

यदि आपको लीप सेकंड की आवश्यकता नहीं है। –

5

तुम सिर्फ वाक्य रचना को मान्य करना चाहते हैं, यहाँ POSIX regex है:

[0-9]{1,4}/[0-9]{1,2}/[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2} 

लेकिन तुम अर्थ विज्ञान की जाँच करना चाहते हैं, मैं स्ट्रिंग अपनी पसंद के भाषा का प्रयोग पर कार्रवाई होगी, देखते हैं बहुत से मामलों में आप नियमित अभिव्यक्तियों (जैसे लीप साल/सेकंड, डेलाइट बचत, आदि) के साथ कवर नहीं कर सकते हैं

+0

मुझे लगता है कि यह [0-9] {4,4}/[0-9] {2,2}/[0-9] {2,2} [0-9] { 2,2}: [0-9] {2,2}: [0-9] {2,2} –

+1

आपकी आवश्यकताओं के आधार पर, हां। लेकिन आप {x, x} के बजाय {x} का उपयोग कर सकते हैं। – soulmerge

0

Regular-Expressions.info इन का एक अच्छा स्रोत है RegEx के बारे में गठन, यह भी एक अच्छा tutorial है।

+1

एक टिप्पणी क्यों कम हो गई है इसकी गहराई से सराहना की जाएगी। मैं नहीं देख सकता कि एक RegEx संदर्भ वेबसाइट के लिए लिंक क्यों देना चाहिए, विशेष रूप से जब यह प्रश्न में बताता है "कृपया मुझे एक संदर्भ या ऐसा करने का तरीका दें।" – RuudKok

0

(\d\d)?\d\d\/\d\d?/\d\d? \d\d?:\d\d:\d\d 

का प्रयोग वाक्य रचना को मान्य सकता है, लेकिन के रूप में balpha बताते हैं, कि यह कोई मान्य दिनांक नहीं है।

6

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

1
function validateTimestamp(timestamp) { 

    if (!/\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}/.test(timestamp)) { 
     return false; 
    } 

    var split = timestamp.split(/[^\d]+/); 

    var year = parseFloat(split[0]); 
    var month = parseFloat(split[1]); 
    var day = parseFloat(split[2]); 

    var hour = parseFloat(split[3]); 
    var minute = parseFloat(split[4]); 
    var second = parseFloat(split[5]); 

    return hour < 25 && minute < 61 && second < 61 && month < 13 && day < 32; 

} 
3

यहाँ एक regex मैं एक प्रारूप है कि तुम क्या उल्लेख करने के लिए इसी में तार सत्यापित करने के लिए आज पहले लिखा है: YYYY-MM-DD hh:mm:ss। यह कुछ बुरी तिथियों की पहचान नहीं करता है (उदाहरण के लिए, 30 फरवरी) लेकिन प्रत्येक स्थिति में सरल \d का उपयोग करने से थोड़ा बेहतर हो सकता है।बातें ध्यान रखें:

  1. तुम सिर्फ एक तारीख है, बस एक समय, या दोनों तिथि + समय निर्दिष्ट कर सकते हैं
  2. समय 12 घंटे या 24 घंटे के प्रारूप में हो सकता
  3. सेकंड वैकल्पिक हैं
  4. AM/pM वैकल्पिक है

    const std::string dateAndTimeRegex = 
        "^\\s*"      // ignore whitespace 
        "("       // start of date 
         "201[0-9]"    // year: 2010, 2011, ..., through 2019 
         "\\W"     // delimiter between year and month; typically will be "-" 
         "([0]?[0-9]|1[012])" // month: 0 through 9, or 00 through 09, or 10 through 12 
         "\\W"     // delimiter between month and day; typically will be "-" 
         "([012]?[0-9]|3[01])" // day: 0 through 9, or 00 through 29, or 30, or 31 
        ")?"      // end of optional date 
        "\\s?"      // optional whitespace 
        "("       // start of time 
         "([01]?[0-9]|2[0-3])" // hour: 0 through 9, or 00 through 19, or 20 through 23 
         "\\W"     // delimiter between hours and minutes; typically will be ":" 
         "([0-5][0-9])"   // minute: 00 through 59 
         "("      // start of seconds (optional) 
          "\\W"    // delimiter between minutes and seconds; typically will be ":" 
          "([0-5][0-9])"  // seconds: 00 through 59 
         ")?"     // end of optional seconds 
         "(\\s*[AaPp][Mm])?"  // optional AM, am, PM, pm 
        ")?"      // end of optional time 
        "\\s*$";     // trailing whitespace 
    
4

मैं सिर्फ एक Regex एक MySQL datetime नियंत्रित करने के लिए लिखा था (और मुझे लगता है कि यह इतना अंतर नहीं है ओरेकल या अन्य डेटाबेस सर्वर के लिए erent)।

यह रेगेक्स बहुत सुरक्षित है और तिथि की वैधता को नियंत्रित करता है (28, 30 & में 31 महीने, और यहां तक ​​कि 2 9/02 के साथ भी वर्ष)। फिर, यह समय को नियंत्रित करता है।

YYYY-MM-YYY HH: MM: SS

यहाँ Regex (काफी लंबा) है: टाइमस्टैम्प प्रारूप इस एक है

((((19|20)([2468][048]|[13579][26]|0[48])|2000)-02-29|((19|20)[0-9]{2}-(0[4678]|1[02])-(0[1-9]|[12][0-9]|30)|(19|20)[0-9]{2}-(0[1359]|11)-(0[1-9]|[12][0-9]|3[01])|(19|20)[0-9]{2}-02-(0[1-9]|1[0-9]|2[0-8])))\s([01][0-9]|2[0-3]):([][0-9]):([][0-9])) 

से मेल खाता है

2013-04-05 17:59:59 | 2013-07-30 01:22:42 | 20 99-12-30 23:59:59 | 2016-02-28 00:00:00

गैर से मेल खाता है

2016-02-29 -01: 01: 02 | 3000-04-24 17:42:21 | 2012-03-03 24:24:02 | 2012-03-03 21:60:45

मुझे नहीं लगता कि मैं एक और अधिक सुरक्षित बना सकता हूं। बहुत फनल और परीक्षण किया। कृपया, अगर आप इसका इस्तेमाल, मुझे प्रतिक्रिया देने के लिए संकोच नहीं करते;)

FYI करें: आप सिर्फ समय के बिना तारीख Regex नियंत्रण के लिए देखो, तो कृपया वहां यह पता लगाने के लिए: Regular Expression to match valid dates (मेरी पोस्ट की जाँच करें) ।

चीयर्स

1

वर्ष 1000 और वर्ष 2999 के इस्तेमाल के बीच एक मान्य दिनांक के लिए:

String pattern = "((1\\d{3})|(20\\d{2}))-((0\\d)|(1[0-2]))-(([1-2]\\d)|(3[0-1])) (([0-1]\\d)|(2[0-3])):([0-5]\\d):([0-5]\\d)"; 

महीने 01 और 12 के बीच भिन्न हो सकते हैं, 01 और 31 और 00:00 के बीच के समय के बीच के दिनों : 00 और 23:59:59।

0
function isTimestamp($input){ 
      var $regex = /^\d\d\d\d-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$/; 
      return $regex.test($input); 
     } 

की जांच करें

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