मुझे StringTokenizer का विचार पसंद है क्योंकि यह Enumerable है।
लेकिन यह अप्रचलित भी है, और String.split द्वारा प्रतिस्थापित किया जाता है जो एक उबाऊ स्ट्रिंग लौटाता है [] (और इसमें व्यंजनों को शामिल नहीं किया गया है)।
इसलिए मैंने एक StringTokenizerEx लागू किया, जो कि एक Iterable है, और जो एक स्ट्रिंग को विभाजित करने के लिए एक वास्तविक regexp लेता है।
एक वास्तविक रीजैक्सप का अर्थ है कि यह एक 'चरित्र अनुक्रम' नहीं है जो कि सीमांकक बनाने के लिए दोहराया गया है:
'ओ' केवल 'ओ' से मेल खाएगा, और 'ओओ' को तीन सीमांकक में विभाजित करेगा, जिसमें दो खाली स्ट्रिंग होंगे:
[o], '', [o], '', [o]
लेकिन रेगेक्स ओ + "एओओब" को विभाजित करते समय अपेक्षित परिणाम लौटाएगा
[], 'a', [ooo], 'b', []
इस StringTokenizerEx का उपयोग करने के लिए:
final StringTokenizerEx aStringTokenizerEx = new StringTokenizerEx("boo:and:foo", "o+");
final String firstDelimiter = aStringTokenizerEx.getDelimiter();
for(String aString: aStringTokenizerEx )
{
// uses the split String detected and memorized in 'aString'
final nextDelimiter = aStringTokenizerEx.getDelimiter();
}
इस क्लास का कोड DZone स्निपेट्स पर उपलब्ध है ।
हमेशा की तरह एक कोड-चैलेंज प्रतिक्रिया (परीक्षण मामलों के साथ एक स्व-निहित वर्ग), कॉपी-पेस्ट करें ('src / test' निर्देशिका में) और इसे चलाएं । इसकी मुख्य () विधि अलग-अलग उपयोगों को दर्शाती है।
नोट: (२०० ९ के अंत में संपादित करें)
लेख अंतिम विचार: जावा गूढ़ व्यक्ति: विभाजन मेल एक अच्छा काम करता है जिसमें विचित्र व्यवहार की व्याख्या की गई है String.split()।
जोश बलोच ने भी उस लेख के जवाब में टिप्पणी की:
हाँ, यह एक दर्द है। FWIW, यह एक बहुत अच्छे कारण के लिए किया गया था: पर्ल के साथ संगतता।
जिस आदमी ने यह किया वह माइक "मैडबॉट" मैकक्लोस्की है, जो अब Google में हमारे साथ काम करता है। माइक ने सुनिश्चित किया कि जावा की नियमित अभिव्यक्तियाँ लगभग हर 30K पर्ल नियमित अभिव्यक्ति परीक्षणों (और तेज़ी से चली) में से प्रत्येक में उत्तीर्ण हुईं।
Google की सामान्य लाइब्रेरी अमरूद में एक स्प्लिटर भी होता है जो है:
- उपयोग करने के लिए सरल
- Google द्वारा अनुरक्षित (और आपके द्वारा नहीं)
तो यह जाँच के लायक हो सकता है। उनके प्रारंभिक मोटे दस्तावेज (पीडीएफ) से :
JDK के पास यह है:
String[] pieces = "foo.bar".split("\\.");
इसका उपयोग करना ठीक है यदि आप चाहते हैं कि यह वास्तव में क्या करे: - नियमित अभिव्यक्ति - एक सरणी के रूप में परिणाम - खाली टुकड़ों को संभालने का इसका तरीका
मिनी-गूढ़ व्यक्ति: ", ए, बी,"। विभाजन (",") रिटर्न ...
(a) "", "a", "", "b", ""
(b) null, "a", null, "b", null
(c) "a", null, "b"
(d) "a", "b"
(e) None of the above
उत्तर: (e) उपरोक्त में से कोई नहीं।
",a,,b,".split(",")
returns
"", "a", "", "b"
केवल अनुगामी खाली जगह छोड़ रहे हैं! (जो लंघन को रोकने के लिए समाधान जानता है; यह एक मजेदार है ...)
किसी भी मामले में, हमारी फाड़नेवाला बस अधिक लचीली है: डिफ़ॉल्ट व्यवहार सरल है:
Splitter.on(',').split(" foo, ,bar, quux,")
--> [" foo", " ", "bar", " quux", ""]
यदि आप अतिरिक्त सुविधाएँ चाहते हैं, तो उनके लिए पूछें!
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split(" foo, ,bar, quux,")
--> ["foo", "bar", "quux"]
विन्यास विधियों का क्रम मायने नहीं रखता है - बंटवारे के दौरान, खाली करने के लिए जाँच करने से पहले ट्रिमिंग होता है।