2011-10-07 10 views
12

के साथ समाप्त होती है तो मैं परीक्षण करना चाहता हूं कि कोई स्ट्रिंग किसी अंक के साथ समाप्त होती है या नहीं। मैं निम्नलिखित जावा लाइन को प्रिंट करने की उम्मीद करता हूं। यह झूठी क्यों प्रिंट करता है?रेगेक्स परीक्षण करने के लिए यदि कोई स्ट्रिंग

System.out.println("I end with a number 4".matches("\\d$")); 
+0

यह भी आपके प्रश्न से संबंधित हो सकता है: http://stackoverflow.com/questions/627545/java-regexp-problem-www-vs-www – AdrianoKF

उत्तर

8

जावा Regex में, वहाँ Matcher.find() के बीच एक अंतर और Matcher.matches() (स्ट्रिंग में कहीं भी कोई मेल मिलता है) (पूरी स्ट्रिंग के मिलान) है।

स्ट्रिंग केवल एक matches() विधि (इस कोड के बराबर लागू किया: Pattern.compile(pattern).matcher(this).matches();) है, तो आप एक पैटर्न है कि पूर्ण स्ट्रिंग से मेल खाता बनाना होगा:

System.out.println("I end with a number 4".matches("^.*\\d$")); 
+0

असल में, अधिक सरल: System.out.println ("मैं एक संख्या 4 के साथ समाप्त होता हूं" .मैच ("। * \\ d")); लेकिन '$' का मतलब यह होना चाहिए कि मुझे निर्दिष्ट करने की आवश्यकता नहीं है। * शुरुआत में। अंत में '$' क्यों नहीं है? – Thor

+0

अतिरिक्त बैकस्पेस बचने के व्यवहार को हटा देता है। इसलिए "^। * \\ d $" काम नहीं कर सकता है। आप इस तरह ऑनलाइन रेगेक्स परीक्षकों में इसका परीक्षण कर सकते हैं: http://www.regexplanet.com/simple/index.html – Kash

+0

@ जावा में कश, अतिरिक्त बैकस्पेस आवश्यक है –

15

आपका रेगुलर एक्सप्रेशन से पूरी स्ट्रिंग के मिलान नहीं करेगा लेकिन अंतिम भाग। नीचे दिए गए कोड को आज़माएं और इसे ठीक काम करना चाहिए क्योंकि यह पूरी स्ट्रिंग से मेल खाता है। http://www.regexplanet.com/simple/index.html:

System.out.println("I end with a number 4".matches("^.+?\\d$")); 

आप इस तरह ऑनलाइन regex परीक्षकों पर एक त्वरित जांच के लिए इस परीक्षण कर सकते हैं। यह आपको उचित जानकारी के साथ परिणामों में जावा कोड में उपयोग करने के लिए भी देता है।

। + यह सुनिश्चित करेगा कि अंकों से कम से कम एक अक्षर है। ? यह सुनिश्चित करेगा कि यह एक लालची मैच के बजाय आलसी मैच करता है।

+0

इस मामले में आलसी मैच करने का कोई मतलब नहीं है। हम * पूरी तरह से पूरी स्ट्रिंग को गठबंधन करने के लिए '। +' चाहते हैं। फिर यह पिछले चरित्र की तुलना '\ d' से तुलना करने के लिए एक स्थिति को वापस कर देगा, जो एकमात्र चीज है जिसकी हम परवाह करते हैं। –

-1

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

System.out.println("I end with a number 4".matches(".*\\d\$")); 
+0

संकलित नहीं होगा, जावा में '\ $' अवैध है –

1
System.out.println("I end with a number 4".matches(".*\\d")); // prints true 

या

String s = "I end with a number 4"; 
System.out.println(Character.isDigit(s.charAt(s.length()-1))); // prints true 
2

आपका रेगुलर एक्सप्रेशन से अभिव्यक्ति slightly off है। इस प्रयास करें:

System.out.println("I end with a number 4".matches("^.*\\d$")); 

तुम भी बस इस तरह का परीक्षण कर सकते हैं यदि आप एक समय में एक लाइन का मूल्यांकन कर रहे:।,

System.out.println("I end with a number 4".matches(".*\\d")); 

आपका मूल अभिव्यक्ति के बिना * केवल देखने के लिए कि स्ट्रिंग था परीक्षण किया एक संख्या और पाठ के लिए खाता नहीं था जो उस संख्या से पहले हो सकता है। यही कारण है कि यह हमेशा झूठा था।

निम्नलिखित सच करने के लिए मूल्यांकन करता है:

System.out.println("4".matches("^\\d$")); 
संबंधित मुद्दे