2010-03-24 14 views
10

मेरा पहला सवाल और मैं उत्साहित ... मैं जाने के लाइव के बाद से lurked और साइट प्यार करता हूँ, लेकिन मैं किसी भी नौसिखिया त्रुटियों के लिए क्षमा चाहते हैं, स्वरूपण, आदि है ...जावा में यह डेटा YYYY-MM-DD regex क्यों विफल रहता है?

मैं प्रारूप को मान्य करने के लिए प्रयास कर रहा हूँ एक स्ट्रिंग फ़ील्ड जिसमें जावा में एक तिथि है। हम एक स्ट्रिंग में तारीख प्राप्त करेंगे, मैं इसे वास्तविक दिनांक ऑब्जेक्ट में पार्स करने से पहले अपने प्रारूप को मान्य कर दूंगा। प्रारूपित किया जा रहा प्रारूप YYYY-MM-DD प्रारूप में है। हालांकि मैं अपने परीक्षणों में से एक पर अटक कर रहा हूँ, अगर मैं "1999-12-33" परीक्षण असफल हो जायेगी में पारित (के रूप में यह एक दिन में नंबर 33 के साथ करना चाहिए) यह अधूरा पैटर्न के साथ:

((19|20)\\d{2})-([1-9]|0[1-9]|1[0-2])-([12][0-9]|3[01])

हालांकि के रूप में नीचे यह परीक्षण में सफ़ल ही मैंने बोल्ड में पात्रों है (लेकिन यह नहीं होना चाहिए)

((19|20)\\d{2})-([1-9]|0[1-9]|1[0-2])-(0[1-9]|[1-9]|[12][0-9]|3[01])

* अतिरिक्त ध्यान दें, मैं जानता हूँ कि मैं 0?[1-9] में 0[1-9]|[1-9] बदल सकते हैं, लेकिन मैं इसकी सबसे सरल प्रारूप करने के लिए नीचे सब कुछ को तोड़ने के लिए करना चाहता था कोशिश करने और खोजने के लिए यह क्यों काम नहीं कर रहा है।

यहाँ स्क्रैप परीक्षण मैं एक साथ रख दिया सब अलग तिथि परिदृश्यों के माध्यम से चलाने के लिए है:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class scrapTest { 
    public scrapTest() { 
    } 

    public static void main(String[] args) { 

     scrapTest a = new scrapTest(); 
     boolean flag = a.verfiyDateFormat("1999-12-33"); 
    } 

    private boolean verfiyDateFormat(String dateStr){ 
     Pattern datePattern = Pattern.compile("((19|20)\\d{2})-([1-9]|0[1-9]|1[0-2])-(0[1-9]|[1-9]|[12][0-9]|3[01])"); 
     Matcher dateMatcher = datePattern.matcher(dateStr); 
     if(!dateMatcher.find()){ 
      System.out.println("Invalid date format!!! -> " + dateStr); 
      return false; 
     } 
     System.out.println("Valid date format."); 
     return true; 
    } 
} 

Ive के लिए प्रोग्रामिंग की गई ~ 10 साल लेकिन बहुत जावा के लिए नया है, इसलिए कुछ भी समझाने के लिए संकोच न करें जैसा कि आप फिट देखते हैं उतना ही प्राथमिक।

उत्तर

8

मुझे लगता है कि क्योंकि आप dateMatcher.matches() से dateMatcher.find() उपयोग कर रहे हैं बल्कि यह है। पूर्व मैच के लिए दिखता है, बाद वाला पूरा स्ट्रिंग मैच करने की कोशिश करता है। API page देखें। तो मूल रूप से 33 में पहला 3 [1-9] से मेल खाता है जो आपने अभी जोड़ा है और दूसरा 3 किसी भी चीज़ से मेल नहीं खाया जाएगा, लेकिन विधि अभी भी सच है।

if (!dateMatcher.matches()) { 
find() के बजाय

:

+0

धन्यवाद

 Date d = new SimpleDateFormat("yyyy-MM-dd").parse(somestring); if (d == null) { // somestring is not a Date } else { // d is the Date } 

डॉक्स, यह यह था। .matches सही ढंग से पूरे पैटर्न से मेल खाता है। – ProfessionalAmateur

+0

कोई समस्या नहीं, मेरी खुशी :) – miorel

5

(0 [1-9] | [1-9] | [12] [0-9] | 3 [01])

दूसरे मामले, [1-9], होना करने के लिए लग रहा है भाग जो के रूप में सफल हो रहा है, आपके पास स्ट्रिंग के अंत के लिए कोई परीक्षण नहीं है।

यह 1999/12/03 मिलान है, नहीं 1999-12-33

1

तरह Broam ने कहा, अपने पैटर्न की तारीख का हिस्सा है, से मेल पूरे इनपुट स्ट्रिंग, उपयोग से मिलान करने के लिए मिलता है।

2

नहीं वास्तव में प्रश्न का उत्तर है, लेकिन एक सुझाव: एक सरल regex लिखते हैं, और उसके बाद के बजाय अपने regex में की, जावा में संख्यात्मक सत्यापन कार्य करें:

(\\d{4})-(\\d{2})-(\\d{2})

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

3

केवल इसके लिए बने SimpleDateFormat का उपयोग करने के बारे में कैसे? के लिए SimpleDateFormat

+0

अजीब बात ये है कि: SimpleDateFormat प्रारूप = नया SimpleDateFormat ("yyyyMMdd") इससे मेल खाता है: "2015-06-10" –

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