एकाधिक सीमांकक के साथ String.split () का उपयोग करें


201

मुझे सीमांकक पर एक स्ट्रिंग बेस को विभाजित करने की आवश्यकता है -और. । नीचे मेरा वांछित उत्पादन कर रहे हैं।

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

लेकिन मेरा निम्नलिखित कोड काम नहीं करता है।

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}

आपने जो कहा उसके आधार पर, ऐसा लगता है कि यह ठीक काम कर रहा है। आपका वांछित आउटपुट क्या है?
जेफ

2
@ जेफ़: उन्होंने अपना वांछित उत्पादन ( AA/ BB/ CC...) दिखाया
टीजे क्राउडर

2
क्या आपको यकीन है? मैंने व्याख्या की कि उनके वर्तमान आउटपुट के रूप में, उनके वांछित आउटपुट के रूप में नहीं। हो सकता है कि इसके खड़े होने और थोड़ा घूमने का समय हो।
जेफ

@ जेफ़: भ्रम के लिए क्षमा करें, मैंने आपकी गलतफहमी को दूर करने के लिए अपनी पोस्ट अपडेट की।
थांग फाम

रेगेक्स आपके प्रदर्शन को नीचा दिखाएगा। मैं एक विधि लिखने की सलाह दूंगा जो चरित्र और चरित्र द्वारा स्ट्रिंग जाएगी यदि आवश्यकता हो। लॉग (n) प्रदर्शन प्राप्त करने के लिए आप इस फ़्यूचर को ऑप्टिमाइज़ कर सकते हैं।
प्रिंसेस

जवाबों:


311

मुझे लगता है कि आपको regex या ऑपरेटर को शामिल करने की आवश्यकता है :

String[]tokens = pdfName.split("-|\\.");

आपके पास जो मैच होगा:
[DASH के बाद DOT साथ में] -.
नहीं
[DASH या DOT उनमें से कोई भी] -या.


9
हमें दो बैकस्लैश की आवश्यकता क्यों है ??
pjain

7
.Regex में चरित्र नई लाइन के अलावा अन्य किसी भी चरित्र का मतलब है। tutorialspoint.com/java/java_ अनियमित_ expressions.htm इस मामले में, हालांकि, वे वास्तविक चरित्र चाहते थे .। दो बैकस्लैश इंगित करते हैं कि आप का उल्लेख कर रहे हैं .। बैकस्लैश एक एस्केप कैरेक्टर है।
मंकीग्रिंडर

2
सामान्य मामलों के लिए यह होगा .split("match1|match2"), (उदाहरण के लिए split("https|http")), \\ .ऊपर के मामले में विशेष चार से
बचना है

या आम तौर पर, आप pdfName.split("\\W");नीचे दिए गए @Pne Knego उत्तर के रूप में उपयोग कर सकते हैं
ahmednabil88

1
के [-.]बजाय का उपयोग करें-|\\.
सईद

49

इस regex का प्रयास करें "[-.]+"। The + एक के बाद लगातार सीमांकक वर्ण मानता है। यदि आप ऐसा नहीं चाहते हैं तो प्लस निकालें।


8
@ लॉकर्स: केवल यही कारण है कि पीटर को बचना नहीं -था, यह था कि इसके अंदर पहला विचार है [], अन्यथा इसके सामने एक बैकस्लैश होने की आवश्यकता होगी (और निश्चित रूप से, इसके सामने बैकस्लैश डालने के लिए, हमें दो की जरूरत है क्योंकि यह एक स्ट्रिंग शाब्दिक है)।
टीजे क्राउडर

मुझे लगता है कि यह उत्तर स्वीकार किए गए से बेहतर है, क्योंकि जब आप तार्किक ऑपरेटर का उपयोग करते हैं | समस्या यह है कि आपका एक सीमांकक आपके परिणाम 'टोकन' का एक हिस्सा हो सकता है। पीटर केनेगो के [-।] +
जैक '

26

आप regex "\ W" का उपयोग कर सकते हैं। यह किसी भी गैर-शब्द वर्ण से मेल खाता है। आवश्यक पंक्ति होगी:

String[] tokens=pdfName.split("\\W");

यह मेरे लिए काम नहीं करता है `स्ट्रिंग s =" आईडी (INT), नाम (STRING), "। यहां \\ W का उपयोग करने से लंबाई 6 की एक सरणी बन जाती है, जहां यह केवल 4 होना चाहिए
user3527975

2
यह तब भी टूट जाएगा जब इनपुट में यूनिकोड चरित्र होगा। इसके साथ "केवल सभी हड़पने" के बजाय वास्तविक सीमांकक को शामिल करना सबसे अच्छा है \W
न्हठ्ठ

13

आपके splitद्वारा दी जाने वाली स्ट्रिंग एक नियमित अभिव्यक्ति का स्ट्रिंग रूप है, इसलिए:

private void getId(String pdfName){
    String[]tokens = pdfName.split("[\\-.]");
}

इसका मतलब है कि किसी भी चरित्र पर विभाजन करना [](हमें -एक बैकस्लैश के साथ बचना होगा क्योंकि यह अंदर विशेष है []; और निश्चित रूप से हमें बैकलैश से बचना होगा क्योंकि यह एक स्ट्रिंग है)। (इसके विपरीत, .आम तौर पर विशेष है, लेकिन अंदर विशेष नहीं है []।)


आपको इस मामले में हाइफ़न से बचने की ज़रूरत नहीं है, क्योंकि [-.]संभवतः एक सीमा के रूप में व्याख्या नहीं की जा सकती है।
एलन मूर

1
@ एलन: क्योंकि यह कक्षा में पहली चीज है, यह काफी सच है। लेकिन मैं हमेशा करता हूं, बाद में वापस जाना और बिना सोचे-समझे इसके सामने कुछ जोड़ना बहुत आसान है। बच निकलने में कुछ भी खर्च नहीं होता, ...
टीजे क्राउडर

क्या आप जानते हैं कि कोष्ठक कैसे बचते हैं? मेरे पास स्ट्रिंग है [[२००] इंजीनियरिंग "जिसे मैं" २०० "," इंजीनियरिंग "में विभाजित करना चाहता हूं
स्कूट्टीसेयुस ३०'१३

3
ओह वाह मुझे मिल गया ... मुझे एक के बजाय दो बैकस्लैश का उपयोग करना पड़ा। String[] strings = codes.get(x).split("\\[|\\]| ");<- रुचि रखने वाले किसी के लिए कोड
स्कॉटीसियस


4

डेलिमीटर "और" और "ओआर" के रूप में दो चार अनुक्रम के लिए यह काम किया जाना चाहिए। का उपयोग करते समय ट्रिम करने के लिए मत भूलना।

 String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
 String[] cities = text.split("AND|OR"); 

परिणाम: शहर = {"ISTANBUL", "NEW YORK", "PARIS", "TOKYO", "MOSCOW"}


मैं {"ISTANBUL AND", "NEW YORK AND", "PARIS OR", "TOKYO AND", "MOSCOW"} जैसे आउटपुट कैसे प्राप्त कर सकता हूं
Ahamadullah Saikat

3

मैं अपाचे कॉमन्स का उपयोग करूंगा:

आयात org.apache.commons.lang3.StringUtils;

private void getId(String pdfName){
    String[] tokens = StringUtils.split(pdfName, "-.");
}

यह निर्दिष्ट विभाजकों में से किसी पर विभाजित होगा, StringUtils.splitByWholeSeparator(str, separator)जिसके विपरीत एक विभाजक के रूप में पूर्ण स्ट्रिंग का उपयोग करता है


3
String[] token=s.split("[.-]");

9
कृपया इस गलतफहमी से लड़ने में मदद करें कि StackOverflow एक नि: शुल्क कोड-लेखन सेवा है, कुछ स्पष्टीकरण के बिना केवल आपके कोड को उत्तर देकर।
युनानोश

2

इस तरह से कुछ का उपयोग करना बेहतर है:

s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");

नमूने के रूप में कुछ अन्य वर्ण जोड़े हैं। यह उपयोग करने का सबसे सुरक्षित तरीका है, क्योंकि जिस तरह से .और 'इलाज किया जाता है।


1

आपने विभाजन में तर्क के रूप में नियमित अभिव्यक्ति को भी निर्दिष्ट किया हो सकता है () विधि .. उदाहरण के नीचे…।

private void getId(String pdfName){
String[]tokens = pdfName.split("-|\\.");
}

1

इस कोड को आज़माएं:

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);

1
कृपया इस गलतफहमी से लड़ने में मदद करें कि StackOverflow एक नि: शुल्क कोड-लेखन सेवा है, कुछ स्पष्टीकरण के बिना केवल आपके कोड को उत्तर देकर।
युनानोश

0
s.trim().split("[\\W]+") 

कार्य करना चाहिए।


2
पहले, नहीं, यह काम नहीं करता है - शायद आप पोस्ट करने से पहले इसे आज़मा सकते हैं? फिर यह उत्तर आपके जैसा ही है - लेकिन काम कर रहा है। अंत में आपको अपने फॉर्मेटिंग ( काम करना चाहिए। ) की जांच करनी चाहिए
आउटर

1
कृपया इस गलतफहमी से लड़ने में मदद करें कि StackOverflow एक नि: शुल्क कोड-लेखन सेवा है, कुछ स्पष्टीकरण के बिना केवल आपके कोड को उत्तर देकर।
युनानोश

-1

यदि आप जानते हैं कि स्टिंग हमेशा एक ही प्रारूप में होगा, तो पहले स्ट्रिंग को विभाजित करें .और स्ट्रिंग को एक चर में पहले सूचकांक पर संग्रहीत करें। फिर स्ट्रिंग को -0 और 1 के आधार पर दूसरे इंडेक्स में विभाजित करें और अंत में स्टोरेज इंडेक्स को विभाजित करें।. और आपको सभी संबंधित क्षेत्रों को प्राप्त करना चाहिए।

निम्नलिखित स्निपेट देखें:

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...

6
यह एक चरण में किया जा सकता है, इसलिए इसे एक चरण में करें। अन्य उत्तर देखें।
काज

2
pdfName.split(".")परिणाम एक शून्य-लंबाई सरणी में।
एलन मूर

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