2010-03-05 10 views
8

यह शायद एक तेज़ है। यह कोड कुछ भी क्यों नहीं लौटाता है?जावा: पैटर्न के लिए स्कैनिंग स्ट्रिंग

import java.util.Scanner; 

public class MainClass { 

public static void main(String[] args) { 
    try { 

     Scanner sc = new Scanner("asda ASA adad"); 
     String pattern = "[A-Z]+"; 

     while ((sc.hasNext(pattern))) { 

      System.out.println(sc.next(pattern)); 
     } 
     sc.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

उत्तर

15

hasNext(String pattern) केवल true लौटाता है यदि अगले टोकन नमूने का मिलान। आपके मामले में, "asda" अगला टोकन है, और यह "[A-Z]+" से मेल नहीं खाता है। दस्तावेज स्पष्ट है कि "[स्कैनर किसी भी इनपुट से पहले अग्रिम नहीं करता है"।

यदि आप पैटर्न को "[A-Za-z]+" पर बदलते हैं, तो आपको तीन टोकन मिलेंगे, जो आपके इरादे से हो सकते हैं।

वास्तव में आप केवल टोकन कि "[A-Z]+" से मेल प्राप्त करना चाहते हैं, तो आप भी कर सकते हैं निम्नलिखित:

  • बस न खाने वाले टोकन
  • useDelimiter("[^A-Z]+") त्यागें, तो बस आह्वान next()
  • का उपयोग skip("[^A-Z]+")
  • उपयोग findInLine("[A-Z]+")

युक्ति: यदि प्रदर्शन महत्वपूर्ण है, तो आप इन तरीकों के precompiled Pattern अधिभार का उपयोग करना चाहते हैं।

युक्ति: ध्यान रखें कि "Xooo ABC" में दो "[A-Z]+" मैचों हैं। यदि यह वही नहीं है जो आप चाहते हैं, तो रेगेक्स को थोड़ा और जटिल होना होगा। या आप हमेशा गैर मिलान वाले टोकन को त्याग सकते हैं।

0

बदलें

String pattern = "[A-Z]+"; 

आप अपने सीमांकक से घिरे सभी शब्दों आप सुरक्षित रहने के लिए चाहते हो सकता है बाहर प्रिंट और पैटर्न पूरी तरह बाहर करने के लिए देख रहे हैं

String pattern = "[a-zA-Z]+"; 
0

करने के लिए। इस तरह आप ऐसे शब्द में नहीं आते हैं जिसमें आपके पैटर्न में कोई चरित्र न हो जो आपके प्रोग्राम को उस लूप से बाहर निकलने का कारण बनता है (जैसा कि यह वर्तमान में कर रहा है)। उदाहरण के लिए:

while ((sc.hasNext())) { 

     System.out.println(sc.next()); 
    } 
संबंधित मुद्दे