डेलिमिटर के रूप में डॉट के साथ स्प्लिट स्ट्रिंग


100

मैं सोच रहा हूं कि क्या मैं एक स्ट्रिंग को .सही तरीके से विभाजित करने जा रहा हूं ? मेरा कोड है:

String[] fn = filename.split(".");
return fn[0];

मुझे केवल स्ट्रिंग के पहले भाग की आवश्यकता है, यही कारण है कि मैं पहला आइटम वापस करता हूं। मैं पूछता हूं क्योंकि मैंने एपीआई में देखा है जिसका .मतलब है कि कोई भी चरित्र, इसलिए अब मैं फंस गया हूं।

जवाबों:


174

split()एक नियमित अभिव्यक्ति को स्वीकार करता है, इसलिए आपको .इसे रेगेक्स मेटा चरित्र के रूप में नहीं समझने के लिए भागने की आवश्यकता है । यहाँ एक उदाहरण है:

String[] fn = filename.split("\\."); 
return fn[0];

17

स्प्लिट नियमित अभिव्यक्ति का उपयोग करता है, जहां '।' एक विशेष चरित्र का अर्थ है कुछ भी। यदि आप वास्तव में यह चाहते हैं कि आप इसे बचाना चाहते हैं '।' चरित्र:

String[] fn = filename.split("\\.");

(एक '\' नियमित अभिव्यक्ति में '' से बचने के लिए और दूसरा जावा स्ट्रिंग में पहले से बचने के लिए)

इसके अलावा, मैं आपको fn [0] वापस करने का सुझाव नहीं something.blabla.txtदूंगा क्योंकि अगर आपके पास कोई फ़ाइल है , जो एक वैध नाम है तो आप वास्तविक फ़ाइल नाम नहीं लौटाएंगे। इसके बजाय मुझे लगता है कि यह बेहतर है यदि आप उपयोग करते हैं:

int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);

सवाल जावा को टैग किया गया है, जावास्क्रिप्ट को नहीं, जो आप से जुड़ा हुआ है।
आंद्रेई फियरबंटेनु

17

मैं यहां केवल समाधान देखता हूं लेकिन समस्या का कोई पूर्ण विवरण नहीं है इसलिए मैंने इस उत्तर को पोस्ट करने का निर्णय लिया

संकट

आपको कुछ चीजों के बारे में जानने की जरूरत है text.split(delim)splitतरीका:

  1. तर्क को नियमित अभिव्यक्ति (रेगेक्स) के रूप में स्वीकार करता है जो परिसीमन का वर्णन करता है जिस पर हम विभाजित करना चाहते हैं,
  2. यदि पहले delimकी textतरह a,b,c,,(जहां सीमांकक ,) splitमौजूद है, तो पहले की तरह ["a" "b" "c" "" ""]ही सरणी बनाएंगे, लेकिन ज्यादातर मामलों में हमें वास्तव में इन अनुगामी खाली तारों की आवश्यकता नहीं होती है क्योंकि यह हमारे लिए उन्हें स्वचालित रूप से हटा भी देता है। तो यह इन खाली तारों के पीछे एक और सरणी बनाता है और इसे वापस करता है

आप यह भी पता चला है कि जरूरत डॉट. है विशेष वर्ण में regex । यह किसी भी चरित्र का प्रतिनिधित्व करता है (लाइन विभाजकों को छोड़कर लेकिन इसे Pattern.DOTALLध्वज के साथ बदला जा सकता है )।

तो स्ट्रिंग के लिए जैसे "abc"अगर हम "." splitविधि पर विभाजित करेंगे

  1. सरणी बनाएं जैसे ["" "" "" ""],
  2. लेकिन चूंकि इस सरणी में केवल खाली तार हैं और वे सभी पीछे चल रहे हैं, उन्हें हटा दिया जाएगा (जैसे पिछले दूसरे बिंदु में दिखाया गया है)

जिसका अर्थ है कि हमें रिजल्ट एरे के रूप में मिलेगा [](बिना तत्वों के, खाली स्ट्रिंग के साथ भी), इसलिए हम इसका उपयोग नहीं कर सकते fn[0]क्योंकि कोई इंडेक्स 0 नहीं है।

उपाय

इस समस्या को हल करने के लिए आपको बस regex बनाने की आवश्यकता है जो डॉट का प्रतिनिधित्व करेगा। ऐसा करने के लिए हमें उससे बचने की जरूरत है .। इसे करने के कुछ तरीके हैं, लेकिन सबसे सरल संभवतया उपयोग करके है \(जो स्ट्रिंग में लिखे जाने की आवश्यकता है "\\"क्योंकि \वहां भी विशेष है और दूसरे \को बच निकलने की आवश्यकता है )।

तो आपकी समस्या का समाधान दिख सकता है

String[] fn = filename.split("\\.");

बक्शीश

आप उस डॉट से बचने के लिए अन्य तरीकों का भी उपयोग कर सकते हैं

  • चरित्र वर्ग का उपयोग करना split("[.]")
  • बोली में लपेटकर split("\\Q.\\E")
  • Pattern.LITERALध्वज के साथ उचित पैटर्न का उपयोग करना
  • या बस का उपयोग करें split(Pattern.quote("."))और regex आप के लिए भागने करते हैं।

यह .. मुझे वास्तव में पसंद है: split("[.]")
ड्रैगनबॉर्न

15

स्ट्रिंग # विभाजन (स्ट्रिंग) विधि नियमित अभिव्यक्ति का उपयोग करती है। नियमित अभिव्यक्तियों में, "।" चरित्र का अर्थ है "कोई भी चरित्र"। आप या तो "बचकर" इस ​​व्यवहार से बच सकते हैं।

filename.split("\\.");

या वर्ण वर्ग में विभाजित करने के लिए विभाजन विधि बता रहा है:

filename.split("[.]");

चरित्र वर्ग वर्णों का संग्रह है। आप लिख सकते हैं

filename.split("[-.;ld7]");

और फ़ाइल नाम हर "-", ",", ",", "l", "d" या "7" पर विभाजित किया जाएगा। चरित्र वर्ग के अंदर, "।" एक विशेष चरित्र नहीं है ("मेटाचैकर")।


@MisterSmith आप यहां प्रोग्रामिंग भाषा पर एक नज़र रखना चाहते हैं। हम जावा के बारे में बात कर रहे हैं, जावास्क्रिप्ट नहीं।
f1sh

तुम पूरी तरह ठीक हो। मैं कल थक गया था, दोनों भाषाओं में कोडिंग होने से, जावा डेटाटिप्स पर ध्यान नहीं दिया गया। मुझे लगा कि शायद उत्तर 2010 में वापस सही थे, लेकिन आज किसी भी तरह से ब्राउज़रों ने एक अलग तरीके से व्यवहार किया।
मिस्टर स्मिथ

7

DOT (।) को एक विशेष चरित्र के रूप में माना जाता है और स्ट्रिंग की विभाजन विधि एक नियमित अभिव्यक्ति की अपेक्षा करती है जो आपको इस तरह से करने की आवश्यकता है -

String[] fn = filename.split("\\.");
return fn[0];

जावा में विशेष वर्णों को "\" से बचकर रहने की आवश्यकता है, लेकिन चूंकि जावा में "\" भी एक विशेष चरित्र है, इसलिए आपको इसे फिर से "\" के साथ भागने की आवश्यकता है!



2

यह उपयोग करने के लिए अधिक कुशल नहीं होगा

 filename.substring(0, filename.indexOf("."))

यदि आप केवल वही चाहते हैं जो पहले डॉट पर निर्भर है?




0

नोट: डॉट के बच जाने के बाद भी इस स्निपेट के साथ आगे की देखभाल की जानी चाहिए!

यदि फ़ाइलनाम सिर्फ स्ट्रिंग है "।", तो fn अभी भी 0 लंबाई तक होगा और fn [0] अभी भी एक अपवाद फेंक देगा!

ऐसा इसलिए है, क्योंकि यदि पैटर्न कम से कम एक बार मेल खाता है, तो विभाजन सरणी से सभी अनुगामी खाली तारों (इस प्रकार डॉट से पहले भी !) को छोड़ देगा, खाली सरणी को वापस लौटाया जाएगा।


हाथ में एक की तरह मामलों में सबसे आसान समाधान भी विभाजित करने के लिए कॉल करने के लिए 2 की एक सीमा-तर्क पारित करना है: स्ट्रिंग [] fn = filename.split ("[।]", 2);
avl42


0

ApacheCommons का उपयोग करना सबसे सरल है:

File file = ...
FilenameUtils.getBaseName(file.getName());

ध्यान दें, यह पूर्ण पथ से फ़ाइल नाम भी निकालता है।


-2

splitतर्क के रूप में एक रेगीक्स लेता है। तो आपको "\."इसके बजाय पास होना चाहिए "."क्योंकि "."रेगेक्स में एक मेटाचैकर है।

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