2011-10-21 18 views
5

एक साधारण रेगेक्स लिखना, लेकिन मैं इस पर कभी भी बहुत अच्छा नहीं रहा हूं।जावा रेगेक्स ए-जेड, ए-जेड, 0-9 और (।) (_) (-)

जो मैं करने की कोशिश कर रहा हूं वह यह सुनिश्चित करने के लिए एक स्ट्रिंग (फ़ाइल नाम) की जांच करें कि इसमें केवल ए-जेड, ए-जेड, 0-9 या विशेष वर्ण अंडरस्कोर (_) अवधि (।) या डैश (-) शामिल हैं।

यहाँ मैं क्या

if(filename.length() < 1 || !filename.matches("^[a-zA-Z0-9[.][_][-]]+")) 
    return false; 
else 
    return true; 

है यह काम करने के लिए प्रकट होता है, लेकिन मेरे लिए बहुत ही सुंदर नहीं लगती है। क्या यह लिखने के लिए एक बेहतर/अधिक पठनीय तरीका है?

अग्रिम धन्यवाद! बस इन बगर्स को बेहतर तरीके से लिखना सीखने की कोशिश कर रहा है।

-Will

+1

दूसरों अच्छी तरह regex सवाल का जवाब दे दिया है, लेकिन मैं उत्सुक हूँ तुम क्यों जाँच स्ट्रिंग की लंबाई की तुलना में 1. अधिक है, तो स्ट्रिंग "है", यह मेल नहीं खा सकता '" ^। + "' – kojiro

+0

अच्छी बात। यह पिछले कार्यान्वयन से बचा था। धन्यवाद! –

उत्तर

10

आपको चरित्र वर्ग के अंदर [] का उपयोग करने की आवश्यकता नहीं है।

तो, आप लिख सकते हैं:

^[-a-zA-Z0-9._]+ 

इसके अलावा, आप \\w बजाय a-zA-Z0-9_ उपयोग कर सकते हैं।

तो, regexp होगा:

^[-\\w.]+ 

इसके अलावा, इस regexp लेने वाली StackOverflow 22.10 द्वारा StackOverflow 22.10$$2011 इस तरह की स्ट्रिंग से मेल खाएगी। आप अपने स्ट्रिंग की जरूरत है पूरी तरह से उन चरित्र से मिलकर बनता है, तो आप $ साथ पैटर्न खत्म होना चाहिए - स्ट्रिंग के अंत:

^[-\\w.]+$ 
+0

वास्तव में, अधिकांश रेगेक्स स्वादों में उन अतिरिक्त वर्ग ब्रैकेट को वाक्यविन्यास त्रुटि के रूप में माना जाएगा। –

+0

धन्यवाद! यह बहुत बेहतर दिखता है –

+0

\\ w किसी भी यूटीएफ -8 वर्ण की अनुमति देगा, केवल ए-जेड और ए-जेड नहीं। इसके बारे में भी जागरूक रहें। यदि आप का शाब्दिक अर्थ है तो किसी भी चरित्र से मेल खाना चाहिए और इससे बचने की जरूरत है। –

1
try { 
    boolean foundMatch = subjectString.matches("^[\\w.-]+$"); 
} catch (PatternSyntaxException ex) { 
    // Syntax error in the regular expression 
} 

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

मूल रूप से \ w [a-zA-Z_0-9] के लिए एक लघुरूप है और मैं बस आपको इच्छित दो अन्य अक्षर जोड़ता हूं।

+0

मुझे जावा के आरई इंजन को नहीं पता है, लेकिन आम तौर पर आपको स्ट्रिंग की शुरुआत में एंकर करने की आवश्यकता होती है, या फिर "@ # $% @ # $% foo" स्वीकार किया जाएगा। –

+0

@ ऑस्करकोर्ज़ पहले से ही एंकर को जोड़ा गया था इससे पहले कि मैंने टिप्पणी m8 देखा :) – FailedDev

+0

जावा की 'मैचों()' विधि स्वचालित रूप से दोनों सिरों पर मैच को एंकर करती है, लेकिन स्पष्ट एंकरों का उपयोग करने में कोई हानि नहीं होती है, और मुझे लगता है कि यह करने की अच्छी नीति है इसलिए। मुझे उस लुकहेड का बिंदु नहीं दिख रहा है, हालांकि (यानी, '(? = [\\ w .-] + $) ')।साथ ही, ध्यान रखें कि PatternSyntaxException एक रनटाइम अपवाद है; आपको इसे पकड़ने की आवश्यकता नहीं है। –

0

यहाँ एक विधि है कि और अधिक महंगा है (क्योंकि यह वास्तव में डिस्क को छू लेती है), लेकिन हो जाएगा पार मंच

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

अब यह एक सामान्य नियम (प्रोग्राम प्रवाह निर्धारित करने के लिए अपवादों का उपयोग करके) का उल्लंघन करता है, और डिस्क पर जाने का नुकसान होता है। लेकिन यह एक अलग दृष्टिकोण है और आपको उन विचारों को दे सकता है जिनका आप उपयोग कर सकते हैं।

public boolean isValidFileName(final String fileName) { 
    final File file = new File(fileName); 
    final boolean isValid = true; 
    try { 
     if (file.createNewFile()) { 
      file.delete(); 
     } 
    } catch (IOException e) { 
     isValid = false; 
    } 
    return isValid; 
} 
+0

यह संभावित रूप से अलग-अलग प्लेटफॉर्म पर अलग-अलग परिणाम देगा। यह आमतौर पर क्रॉस-प्लेटफ़ॉर्म द्वारा इसका अर्थ है जो मैं समझता हूं। –

+0

विचार यह है कि यह कार्यक्षमता के लिए एक इंटरफ़ेस प्रदान करता है, लेकिन लागू किया गया है विभिन्न प्लेटफार्मों पर अलग-अलग। ऐसा इसलिए है क्योंकि प्रत्येक व्यक्ति यह अलग करता है कि यह बहुत अच्छा काम करता है। एकमात्र असली मुद्दा यह है कि जब आपके पास एक प्लेटफॉर्म एक और मंच बताता है जो ठीक है या क्या नहीं है। और जैसे मैंने यह कहा कि यह सिर्फ अन्य विचारों के लिए एक एवेन्यू देने का विचार है। – corsiKa

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