2011-01-25 12 views
8

तुच्छ रेगेक्स प्रश्न (उत्तर शायद जावा-विशिष्ट है):जावा में अपेक्षित के रूप में यह regex काम क्यों नहीं करता है?

"#This is a comment in a file".matches("^#") 

यह झूठा रिटर्न देता है। जहां तक ​​मैं देख सकता हूं, ^ का अर्थ है कि इसका हमेशा क्या अर्थ है और # का कोई विशेष अर्थ नहीं है, इसलिए मैं स्ट्रिंग की शुरुआत में ^# को "ए" # के रूप में अनुवादित करूंगा। जो मैच करना चाहिए। और ऐसा करता है, पर्ल में:

perl -e "print '#This is a comment'=~/^#/;" 

प्रिंट "1"। तो मुझे पूरा यकीन है कि उत्तर कुछ जावा विशिष्ट है। क्या कोई मुझे प्रबुद्ध करेगा?

धन्यवाद।

उत्तर

17

Matcher.matches() यह देखने के लिए जांच करता है कि संपूर्ण इनपुट स्ट्रिंग रेगेक्स द्वारा मेल खाती है।

चूंकि आपका रेगेक्स केवल पहले अक्षर से मेल खाता है, यह false देता है।

आप इसके बजाय Matcher.find() का उपयोग करना चाहेंगे।

दी, ताकि उसे कुछ ठोस विनिर्देश को खोजने के लिए मुश्किल हो सकता है, लेकिन यह नहीं है:

  • String.matches()Pattern.matches(regex, str) के रूप में ही बात कर के रूप में परिभाषित किया गया है।
  • Pattern.matches() बदले में Pattern.compile(regex).matcher(input).matches() के रूप में परिभाषित किया गया है।
  • Matcher.matches() इस (जोर मेरा) की तरह से प्रलेखित है:

    प्रयास पैटर्न के खिलाफ पूरे क्षेत्र से मिलान करने के।

+0

यह सही जवाब है, धन्यवाद। क्या यह कहीं दस्तावेज है? क्योंकि मैं इसे String.matches के दस्तावेज़ से नहीं पढ़ सकता: "बताता है कि यह स्ट्रिंग दी गई नियमित अभिव्यक्ति से मेल खाती है या नहीं।" आपके द्वारा वर्णित की तरह नहीं लगता है। – 0xCAFEBABE

+0

मैंने हमेशा "संपूर्ण इनपुट" को इंगित करने के लिए "मैचों" को समझा है, लेकिन मैंने उपरोक्त पूर्ण स्पष्टीकरण (और इसे कैसे ढूंढें) जोड़ा है। –

+0

धन्यवाद एक गुच्छा। – 0xCAFEBABE

2

matches विधि पूरे स्ट्रिंग के खिलाफ अपने रेगुलर एक्सप्रेशन से मेल खाता है।

तो बाकी स्ट्रिंग से मेल खाने के लिए .* जोड़ने का प्रयास करें।

"#This is a comment in a file".matches("^#.*") 

जो true देता है। कोई रेगेक्स से सभी एंकर (प्रारंभ और अंत दोनों) को भी छोड़ सकता है और match विधि हमारे लिए इसे जोड़ देगा। तो उपर्युक्त मामले में हम "#.*" का उपयोग रेगेक्स के रूप में भी कर सकते थे।

+0

... जो केवल तभी काम करेगा जब स्ट्रिंग में कोई नईलाइन न हो, जब तक कि आप अपने regex में '(? S)' प्रीपेड न करें ... –

0

यह आपकी अपेक्षाओं को पूरा करना चाहिए:

"#This is a comment in a file".matches("^#.*$") 

अब इनपुट स्ट्रिंग नमूने का मिलान "सबसे पहले चार # होगा, बाकी किसी भी वर्ण बना रहेगा"


Joachims टिप्पणी के बाद, निम्नलिखित समतुल्य है:

"#This is a comment in a file".matches("#.*") 
+0

इस मामले में, एंकर ('^' और '$') दोनों हैं अनावश्यक, क्योंकि वे 'मैचों()' द्वारा निहित हैं। –

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