String.split को पाइप सीमांकक से बचने की आवश्यकता क्यों है?


140

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

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 करें, अगर आप शाब्दिक स्ट्रिंग से मेल खाने की कोशिश कर रहे हैं तो आप पैटर्न .quote को भी देख सकते हैं । यह एक लेता है Stringऔर एक regex देता है Stringजो इनपुट से मेल खाता है (यानी, यह आपके लिए सभी भागने का ख्याल रखता है)।
यशस्वी

+1 के लिएPattern.quote
redDevil

जवाबों:


175

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


76

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


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

यदि स्ट्रिंग लाइन के मूल्य में कुछ पाइप वर्ण हैं तो क्या होगा? आप बिना विभाजन के पाइप को कैसे विभाजित कर पाएंगे? ?
अलेक्जेंडरेज

@AlexandreJ आप कैसे एक पंक्ति विभाजित करने के लिए पूछ रहे हैं कि लगता है जैसे: Some|Delimited|Text|With|An\|Embedded|Pipe|Charमें ("Some", "Delimited", "Text", "With", "An\|Embedded", "Pipe", "Char")? स्प्लिट फ़ंक्शन इस तरह से भागने का समर्थन नहीं करता है, लेकिन आप एक नियमित अभिव्यक्ति को शिल्प करने में सक्षम हो सकते हैं जो इस मामले के लिए काम करेंगे, जैसे कि समूह के पीछे शून्य-चौड़ाई नकारात्मक अभिकथन के साथ: (?<!\\)\|जो होगाline.split("(?<!\\\\)\\|");
dlamblin

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.