2012-03-21 12 views
140

मैं एक ऐसी फाइल को पार्स करने की कोशिश कर रहा हूं जिसमें पाइप सीमित मूल्यों वाली प्रत्येक पंक्ति है। जब मैं विभाजित विधि में पाइप डिलीमीटर से बच नहीं पाया, तो यह ठीक से काम नहीं करता था, लेकिन नीचे से पाइप से बचने के बाद यह सही ढंग से काम करता था।String.split को बचने के लिए पाइप डेलीमीटर क्यों चाहिए?

private ArrayList<String> parseLine(String line) { 
    ArrayList<String> list = new ArrayList<String>(); 
    String[] list_str = line.split("\\|"); // note the escape "\\" here 
    System.out.println(list_str.length); 
    System.out.println(line); 
    for(String s:list_str) { 
     list.add(s); 
     System.out.print(s+ "|"); 
    } 
    return list; 
} 

किसी कृपया समझा क्यों पाइप चरित्र split() विधि के लिए भाग निकले किए जाने की आवश्यकता कर सकते हैं?

+13

जवाब नीचे दिए "क्यों," लेकिन सिर्फ FYI करें, यदि आप एक शाब्दिक स्ट्रिंग मिलान करने के लिए कोशिश कर रहे हैं आप भी [Pattern.quote] पर (लग सकता है http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#quote(java.lang.String))। यह एक 'स्ट्रिंग' लेता है और एक रेगेक्स 'स्ट्रिंग' देता है जो इनपुट से मेल खाता है (यानी, यह आपके लिए सभी भागने का ख्याल रखता है)। 'पैटर्न.कोटे' – yshavit

+0

+1 इस स्पष्टीकरण के लिए धन्यवाद। मैं लगभग डबल बचने के लिए हमेशा भूल जाते हैं। अब जब मुझे पता है कि ऐसा क्यों है, यह निश्चित रूप से मुझे अब से याद रखने में मदद करेगा। – redDevil

उत्तर

175

String.split नियमित अभिव्यक्ति तर्क की अपेक्षा करता है। एक अनपेक्षित | को रेगेक्स के रूप में पार्स किया गया है जिसका अर्थ है "खाली स्ट्रिंग या खाली स्ट्रिंग", जिसका अर्थ यह नहीं है।

76

क्योंकि split पर उस पैरामीटर के सिंटैक्स एक नियमित अभिव्यक्ति है, जहां '|' में OR का एक विशेष अर्थ है, और एक '\ |' का अर्थ है एक शाब्दिक '|' तो स्ट्रिंग "\\ |" का मतलब है नियमित अभिव्यक्ति '\ |' जिसका मतलब है कि वास्तव में चरित्र '|' से मेल खाता है।

+1

के लिए – sufinawaz

+0

क्या होता है यदि स्ट्रिंग लाइन के मान में कुछ पाइप वर्ण हैं? आप भागने वाली पाइप को विभाजित किए बिना विभाजित कैसे कर पाएंगे \ | ? – AlexandreJ

+0

@AlexandreJ क्या आप पूछ रहे हैं कि एक रेखा को कैसे विभाजित करना है: 'कुछ | सीमित | टेक्स्ट | साथ | एक | | एंबेडेड | पाइप |' 'में' '("कुछ", "सीमित", "टेक्स्ट", "के साथ "," एक \ | एम्बेडेड "," पाइप "," चार ")'? स्प्लिट फ़ंक्शन इस तरह से बचने का समर्थन नहीं करता है, लेकिन हो सकता है कि आप एक नियमित अभिव्यक्ति तैयार कर सकें जो इस मामले के लिए काम करेगी, जैसे समूह के पीछे शून्य-चौड़ाई नकारात्मक धारणा देखें: '(? dlamblin

6

आप बस कर सकते हैं:

String[] arrayString = yourString.split("\\|"); 
+0

आपको रेगेक्स" yourString.split ("\\ |") "का उपयोग करने के लिए \" से बचने के लिए है, यह सही सूत्र है। – mautrok

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