String.Split ऑपरेशन में व्हॉट्सएप निर्दिष्ट करने का सबसे अच्छा तरीका है


243

मैं व्हाट्सएप पर आधारित एक स्ट्रिंग का विभाजन कर रहा हूं:

string myStr = "The quick brown fox jumps over the lazy dog";

char[] whitespace = new char[] { ' ', '\t' };
string[] ssizes = myStr.Split(whitespace);

यह मेरे कोड में हर जगह चार [] सरणी को परिभाषित करने के लिए मुझे अपमानजनक है जो मैं यह करना चाहता हूं। क्या और अधिक प्रभावशाली तरीका है जो चरित्र सरणी के निर्माण की आवश्यकता नहीं है (जो कि विभिन्न स्थानों में कॉपी होने पर त्रुटि की संभावना है)?


1
यह करता है: myStr.Split (''); काम नहीं?
वूलगारू

4
अगर मैं इसे सही ढंग से

संभव डुप्लिकेट भी देखें, लेकिन बाद के इन उत्तरों में स्प्लिटस्ट्रिंगऑक्शंस हैं। stackoverflow.com/questions/1562981/…
goodeye

जवाबों:


469

यदि आप फोन करते हैं:

string[] ssize = myStr.Split(null);

या:

string[] ssize = myStr.Split(new char[0]);

तब श्वेत-स्थान को विभाजन वर्ण माना जाता है। से string.Split(char[])विधि के प्रलेखन पेज

यदि विभाजक पैरामीटर है nullया कोई वर्ण नहीं है, तो श्वेत-स्थान वर्णों को सीमांकित माना जाता है। श्वेत-स्थान वर्ण यूनिकोड मानक द्वारा परिभाषित किए गए हैं और trueयदि वे Char.IsWhiteSpaceविधि में पारित हो जाते हैं तो वापस आ जाते हैं ।

हमेशा, हमेशा, हमेशा प्रलेखन पढ़ें!


2
व्हॉट्सएप द्वारा बंटवारे के साथ परेशानी यह है कि अगर आपको इसे फिर से एक साथ रखना है, तो आपको नहीं पता कि कौन सा व्हाट्सएप चरित्र वापस लाना है।
रॉस प्रेसर

19
(char[])nullयह थोड़ा बेहतर है क्योंकि यह एक नई वस्तु बनाने से बचता है। (आप nullकिसी भी optionsअतिभार के साथ उपयोग नहीं कर सकते हैं )।
आर्टफंकल

5
@RossPresser: एक स्ट्रिंग को एक साथ वापस लाना एक पूरी तरह से अलग समस्या है, इसलिए मैं यह नहीं कहूंगा कि यह एक समस्या है। लेकिन अगर आपको बस इतना करना है कि स्ट्रिंग को वापस एक साथ रखा जाए तो यह पहले कैसे था, तो शायद बेहतर सिर्फ मूल रखें।
stakx -

4
मूर्खतापूर्ण प्रश्न, लेकिन यदि आप उपयोग nullकरते हैं , तो क्या आपको अभी भी निर्दिष्ट करने की आवश्यकता है StringSplitOption.RemoveEmptyEntriesया क्या वे डिफ़ॉल्ट रूप से अनदेखा कर रहे हैं?
यु_ओमिनाई

2
@RossPresser: चूँकि String.Split स्ट्रिंग को विभाजित करने के लिए उपयोग किए जाने वाले वर्णों का ट्रैक रखने के लिए कोई तंत्र प्रदान नहीं करता है, आपका अवलोकन प्रासंगिक नहीं है: आप String.Split का उपयोग करने के लिए जो भी चाहते हैं उसे प्राप्त नहीं कर सकते हैं, ताकि एक अलग क्यू एंड ए की आवश्यकता हो।
टूलमेकरसैट

207

हाँ, यहाँ एक और उत्तर की आवश्यकता है!

सभी समाधान इस प्रकार दूर करने के लिए विहित इनपुट के सीमित डोमेन को संबोधित करते हैं , बुद्धि के लिए: तत्वों के बीच एक ही व्हाट्सएप चरित्र (हालांकि कम से कम समस्या का उल्लेख करने के लिए @ हैचर्नो के लिए टिप)। लेकिन मैं प्रस्तुत करता हूं कि सभी में लेकिन सबसे अस्पष्ट परिदृश्य, इन सभी को विभाजित करके समान परिणाम प्राप्त करना चाहिए :

string myStrA = "The quick brown fox jumps over the lazy dog";
string myStrB = "The  quick  brown  fox  jumps  over  the  lazy  dog";
string myStrC = "The quick brown fox      jumps over the lazy dog";
string myStrD = "   The quick brown fox jumps over the lazy dog";

String.Split(यहाँ अन्य जवाबों में दिखाए गए किसी भी फ्लेवर में) बस तब तक अच्छी तरह से काम नहीं करता है जब तक कि आप RemoveEmptyEntriesइनमें से किसी एक के साथ विकल्प संलग्न नहीं करते हैं :

myStr.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)
myStr.Split(new char[] {' ','\t'}, StringSplitOptions.RemoveEmptyEntries)

जैसा कि चित्रण से पता चलता है, विकल्प छोड़ने से चार अलग-अलग परिणाम मिलते हैं (ए, बी, सी, और डी लेबल) बनाम सभी चार इनपुट से एकल परिणाम जब आप उपयोग करते हैं RemoveEmptyEntries:

String.Split बनाम Regex.Split

बेशक, अगर आपको विकल्पों का उपयोग करना पसंद नहीं है, तो बस रेगेक्स विकल्प का उपयोग करें :-)

Regex.Split(myStr, @"\s+").Where(s => s != string.Empty)

4
मुझे लगता है, @RossPresser, जो कि मेरे क्वालीफ़ायर द्वारा कवर किया गया है "सभी लेकिन सबसे अस्पष्ट परिदृश्यों के तहत" क्योंकि यहां तक ​​कि तत्वों को फिर से जोड़ने के लिए जब भी मैं एक मामले में जहां मैं कई रिक्त स्थान की परवाह करता हूं, तो मुश्किल होगा। मैं एक विहित रूप चाहता हूं - प्रत्येक के बीच एक स्थान। इसलिए मैं सम्मानपूर्वक असहमत हूं - यह "आमतौर पर गलत" के बजाय "शायद ही कभी गलत" होगा।
माइकल सोरेंस

1
CapitalizeEveryWord("This is line one.\n \nThis is line three.")
रॉस प्रेसर

3
यदि आप वास्तव में सोचते हैं कि यह अस्पष्ट है, तो मुझे लगता है कि हमें असहमत होने के लिए सहमत होना पड़ेगा, लेकिन अगर मैंने इस फ़ंक्शन को अपने सॉफ़्टवेयर से छोड़ दिया तो मैं अपनी नौकरी खो दूंगा। उपयोगकर्ता अपनी सामग्री को पसंद करना चाहते हैं जिस तरह से वे इसे देखना चाहते हैं।
रॉस प्रेसर

4
यह एक स्वीकृत उत्तर होना चाहिए, क्योंकि यह बहुत अधिक पूर्ण है।
डेनिस

1
मुझे आश्चर्य है कि आपने .Where(s => s != string.Empty)रेगेक्स में क्यों जोड़ा । चूंकि आप निर्दिष्ट करते हैं \s+(रिक्त स्थान की कोई संख्या) बीच में कोई खाली वस्तु नहीं हो सकती है।
जैक मिलर

44

प्रलेखन के अनुसार :

यदि विभाजक पैरामीटर शून्य है या इसमें कोई वर्ण नहीं है, तो श्वेत-स्थान वर्णों को सीमांकित माना जाता है। श्वेत-स्थान वर्ण यूनिकोड मानक द्वारा परिभाषित किए गए हैं और यदि वे Char.IsWhiteSpace विधि में पास किए गए हैं तो सही वापस आते हैं।

तो बस कॉल करें myStr.Split();कुछ भी पास होने की कोई आवश्यकता नहीं है क्योंकि विभाजक एक paramsसरणी है।


11

तुम क्यों इस्तेमाल नहीं करते ?:

string[] ssizes = myStr.Split(' ', '\t');

2
कोई स्प्लिट अधिभार नहीं है जो दो वर्ण लेता है।
तिकरित

1
@takrl: यहाँ सार्वजनिक स्ट्रिंग देखें [] स्प्लिट ( परमेस चार [] सेपरेटर) .NET v2
रेनाटास एम।

हाँ, यह एक चरित्र सरणी लेता है। आपका कोड स्निपेट दो एकल वर्णों से गुजरता है।
14

15
@takrl: क्या आप जानते है की params keyword क्या है ???
रेनाटास एम।

उसके लिए बहुत अच्छा, +1। संभवतः जिस व्यक्ति को नीचा दिखाया गया, वह या तो नहीं जानता था।
टीकरेले

3

ध्यान दें कि आसन्न व्हाट्सएप का उपयोग करते समय एक भी सीमांकक के रूप में नहीं माना जाएगा String.Split(null) । यदि आपका कोई भी टोकन कई स्थानों या टैब से अलग हो जाता है, तो आपको अपने सरणी में वापस आ गए खाली तार मिल जाएंगे।

प्रलेखन से:

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


2

तो कॉपी और पेस्ट न करें! अपने विभाजन को करने के लिए एक फ़ंक्शन निकालें और इसे पुन: उपयोग करें।

public static string[] SplitWhitespace (string input)
{
    char[] whitespace = new char[] { ' ', '\t' };
    return input.Split(whitespace);
}

कोड का पुन: उपयोग आपका मित्र है


1

आप ऐसा क्यों नहीं करते:

var ssizes = myStr.Split(" \t".ToCharArray());

ऐसा लगता है कि String.ToCharArray().NET 4.0 में एक विधि है!

संपादित करें: जैसा कि VMAtm ने बताया है, यह विधि .NET 2.0 में पहले से मौजूद है!


यह तरीका .NET 2.0 में है !!! msdn.microsoft.com/en-us/library/ezftk57x(VS.80).aspx
VMAtm

1

आप उपयोग कर सकते हैं

var FirstString = YourString.Split ()। First ();

विभाजित करने के लिए स्ट्रिंग।


0

क्या आप इसे इनलाइन नहीं कर सकते?

var sizes = subject.Split(new char[] { ' ', '\t' });

अन्यथा, यदि आप इस सटीक कार्य को अक्सर करते हैं, तो आप हमेशा चार या उस चार सरणी युक्त कुछ बना सकते हैं।

जैसा कि अन्य ने उल्लेख किया है कि आप दस्तावेज़ के अनुसार भी उपयोग कर सकते हैं nullया एक खाली सरणी। जब आप ऐसा करेंगे तो यह व्हॉट्सएप के कैरेक्टर को ऑटोमैटिकली यूज करेगा।

var sizes = subject.Split(null);

0

यदि समान कोड को दोहराना समस्या है, तो स्ट्रिंग वर्ग पर एक विस्तार विधि लिखें जो विभाजन तर्क को अलग करता है।


1
यह वास्तव में इस सवाल का जवाब नहीं देता, क्षमा करें।
15 अक्टूबर को p.campbell

पी। कैंपबेल: हाँ, यह करता है: ओपी ने एक समाधान के लिए कहा जिसमें हर जगह चरित्र सरणी की प्रतिलिपि बनाने की आवश्यकता नहीं है। एक स्पष्ट समाधान कार्य करने के लिए एक फ़ंक्शन बनाना है। यह उत्तर बताता है कि ऐसा कार्य एक विस्तार विधि हो सकती है। (जवाब में सुधार किया जा सकता है, ऐसा करने के लिए कोड दिखा कर ...)
टूलमेकरसैट

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