C # में एक और स्ट्रिंग द्वारा एक स्ट्रिंग विभाजित करें


682

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

मैंने स्प्लिटर को चरित्र सरणी में बदलने की कोशिश की है, जिसमें कोई भाग्य नहीं है।

दूसरे शब्दों में, मैं विभाजित करना चाहूंगा string:

THExxQUICKxxBROWNxxFOX

द्वारा xx, और मूल्यों के साथ एक सरणी वापसी:

द क्विक ब्राउन फ़ॉक्स


2
भविष्य चिंताओं के लिए: में से एक नीचे टिप्पणी ने मुझे आकर्षित तो मैं एक खोलने का निर्णय लिया चर्चा के विषय में सॉफ्टवेयर इंजीनियरिंग पर nonintuitive स्वीकार किए जाते हैं जवाब में यह करने के लिए (लेकिन दाएं) जिस तरह से।
स्क्रेच

जवाबों:


1239

स्ट्रिंग द्वारा विभाजित करने के लिए आपको स्ट्रिंग सरणी अधिभार का उपयोग करना होगा ।

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);

4
मैंने वास्तव में 2 कारणों से अपना उत्तर बदलना समाप्त कर दिया: # 1: मैं जो विभाजन करना चाहता हूं उसे संभालने के लिए मुझे Regex.Escape का उपयोग करने की आवश्यकता होगी, क्योंकि मेरे विभाजन स्ट्रिंग में अक्सर तारांकन आदि होंगे। # 2: जबकि इस कार्यक्रम मैं लिख रहा हूँ कोई वास्तविक अनुकूलन की जरूरत है, वहाँ Regex स्प्लिट विधि का उपयोग करने के साथ शामिल अतिरिक्त उपरि प्रतीत होता है।
ब्रैंडन

7
@ पेटर: उस पोस्ट में जॉन इसे सुझा रहे हैं क्योंकि पोस्टर में एक निश्चित सीमांकक नहीं है; वह "एक से अधिक स्थान" (अर्थ 2+) द्वारा विभाजित तारों को अलग करना चाह रहा है। एक मूल्य के बजाय एक पैटर्न द्वारा सीमांकित तार के लिए , RegEx एक महान (अच्छी तरह से, एकमात्र ) विकल्प है। फिक्स्ड-वैल्यू डेलिमिटर के लिए, यह अनावश्यक ओवरहेड का परिचय देता है। परीक्षण चलाने का प्रयास करें; जैसे-जैसे संचालन की संख्या बढ़ती है, RegEx ~ 10x के आसपास कहीं भी एक संगत के रूप में ले जाता है । string.Split
एडम रॉबिन्सन

9
मैं पायथन से C # आता हूं। पायथन एक और स्ट्रिंग द्वारा स्ट्रिंग विभाजन का समर्थन करता है। और मुझे अक्सर इस सवाल पर वापस आने के लिए एक सरल उत्तर की आवश्यकता होती है string[] Split(string pattern), जो कि सबसे प्राकृतिक उपयोग है जो मैं सोच सकता था कि यह अभी तक नहीं है। मैंने C से पहले लिखा था इसलिए मुझे सरणियों के लिए उपयोग किया जाता है लेकिन मुझे अभी भी char[]C # कोड में पॉपिंग देखने से नफरत है क्योंकि यह अचानक स्ट्रीम स्तर से बाइट स्तर तक मेरा ध्यान आकर्षित करता है। किसी को पता है कि C # लाइब्रेरी वालों ने स्प्लिट मेथड इस तरह क्यों बनाया है? यदि कोई अच्छा कारण है, तो मैं असुविधा के बावजूद इसकी सराहना करने की कोशिश कर सकता हूं।
पूर्वाभ्यास

11
यह स्निपेट उन चीजों की सूची में बहुत ऊपर है जो मुझे गैर सी # डेवलपर्स को दिखाने में शर्म आएगी।
Traubenfuchs

99
आखिर हम क्यों नहीं कर सकते data.Split("xx")?
मंटन

122

स्प्लिट का एक अधिभार है जो स्ट्रिंग्स लेता है।

"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);

आप इनमें से किसी भी StringSplitOptions का उपयोग कर सकते हैं

  • कोई नहीं - वापसी मान में सरणी तत्व शामिल हैं जिसमें एक खाली स्ट्रिंग शामिल है
  • RemoveEmptyEntries - वापसी मान में एरे तत्व शामिल नहीं होते हैं जिनमें एक खाली स्ट्रिंग होती है

तो अगर स्ट्रिंग "THExxQUICKxxxxBROWNxxFOX" है, StringSplitOptions.Noneतो "xxxx" भाग के लिए सरणी में एक खाली प्रविष्टि लौटाएगा जबकि StringSplitOptions.RemoveEmptyEntriesनहीं करेगा।


73
Regex.Split(string, "xx")

जिस तरह से मैं यह आमतौर पर करते हैं।


बेशक आपको इसकी आवश्यकता होगी:

using System.Text.RegularExpressions;

या:

System.Text.RegularExpressions.Regex.Split(string, "xx")

लेकिन फिर मुझे हर समय उस पुस्तकालय की आवश्यकता होती है।


13
@ ब्रेंडन: जबकि मैं आमतौर पर समय से पहले अनुकूलन के खिलाफ चेतावनी दे रहा हूं, आपको पता होना चाहिए कि नियमित अभिव्यक्ति ओवरहेड की वजह RegEx.Splitसे एक साधारण से काफी अधिक महंगा है String.Split
एडम रॉबिन्सन

9
यदि आप एक मनमाना स्ट्रिंग द्वारा विभाजित करना चाहते हैं, तो Regex.Escapeपहले स्ट्रिंग पर उपयोग करें , यह किसी भी regex मेटा-वर्ण से बच जाएगा।
रिचर्ड

ओवरहेड के लिए भुगतान करने वाले प्रमुख लाभों में से एक स्ट्रिंग तुलनात्मक सेटिंग प्रदान करने की क्षमता है
तैमूर सादिकोव


25

मैं आमतौर पर इसके लिए अपने स्वयं के एक्सटेंशन का उपयोग करना पसंद करता हूं:

string data = "THExxQUICKxxBROWNxxFOX";
var dataspt = data.Split("xx");
//>THE  QUICK  BROWN  FOX 


//the extension class must be declared as static
public static class StringExtension
{   
    public static string[] Split(this string str, string splitter)
    {
        return str.Split(new[] { splitter }, StringSplitOptions.None);
    }
}

हालाँकि, इससे अपवाद हो जाएगा, यदि Microsoft इस पद्धति-अधिभार को बाद के संस्करणों में शामिल करने का निर्णय लेता है। यह भी संभावित कारण है कि इस बीच Microsoft ने इस पद्धति को शामिल नहीं किया है: मैंने जिस कम से कम एक कंपनी के लिए काम किया था, इस तरह के विस्तार का उपयोग उनकी सभी C # परियोजनाओं में किया।

यदि यह मौजूद नहीं है तो रनटाइम पर विधि को सशर्त रूप से परिभाषित करना भी संभव हो सकता है।


4
वैकल्पिक params string[] splitterरूप से, दूसरे पैरामीटर के रूप में उपयोग करें और कई सीमांकक का समर्थन new[] {splitter}करने के splitterलिए बदलें ।
मैथ्यू स्ट्रॉब्रिज

10

पिछले उत्तर सभी सही हैं। मैं एक कदम आगे जाता हूं और स्ट्रिंग पर एक विस्तार पद्धति को परिभाषित करके मेरे लिए C # काम करता हूं :

public static class Extensions
{
    public static string[] Split(this string toSplit, string splitOn) {
        return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None);
    }
}

इस तरह से मैं इसे सरल तरीके से किसी भी तार पर कॉल कर सकता हूं मैंने पहली बार यह अपेक्षा की थी कि मैं इसे पूरा करने की कोशिश करूं:

"a big long string with stuff to split on".Split("g str");


7
string data = "THExxQUICKxxBROWNxxFOX";

return data.Replace("xx","|").Split('|');

बस प्रतिस्थापित चरित्र को ध्यान से चुनें (एक को चुनें जो पहले से ही स्ट्रिंग में मौजूद होने की संभावना नहीं है)!


2
@MasoudHosseini: कृपया पूरा उत्तर पढ़ें; पहले से ही एक अस्वीकरण है।
SNag

3
@kobe: क्योंकि यह एक भयानक हैक है।
ओवर

3
ठीक काम करता है, लेकिन यह सामान्य तरीकों के लिए खतरनाक है
कैज़ोनरो

5
स्पष्टीकरण पोस्ट करना, जैसे "यह एक भयानक हैक है" या "एक बुरा जवाब" सहायक नहीं हैं। यह केवल स्पष्टीकरण के बिना एक राय है। इसके बजाय, कुछ ऐसा बताते हुए, "यह प्रतिस्थापन के लिए स्ट्रिंग को स्कैन करने के लिए अनावश्यक है और तब विभाजन वर्णों के लिए स्कैन करता है क्योंकि यह खराब प्रदर्शन की ओर जाता है।" अपने आप को समझाने का एक बेहतर तरीका होगा। बहुत सारे प्रोग्रामर इस तरह से कार्य करते हैं। :(
मैट रुवे

1
क्या होगा यदि स्ट्रिंग में |पहले से ही चर शामिल है , इस कारण से मुझे लगता है कि इसका उपयोग करना खतरनाक है।
आमद २

-1

यह भी आसान है:

string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

1
लेकिन यह भी अलग हो जाएगा "THExQUICK"जहां हम यह नहीं चाहते हैं कि इसे विभाजित किया जाए
राफेलन

धन्यवाद राफ्लोन: हाँ, ग्रेग का सबसे अच्छा जवाब है: data.Split (नया स्ट्रिंग [] {"xx"}, स्ट्रिंगSplitOptions.RemoveEmptyEntries)
user890255

-4

उपयोग करने का सबसे आसान तरीका है String.Replace:

string myString = "THExxQUICKxxBROWNxxFOX";
mystring = mystring.Replace("xx", ", ");

या अधिक बस:

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");

3
जैसा कि यह है, यह एक सरणी नहीं लौटाएगा (जैसा कि सवाल पूछता है), अल्पविराम के साथ एक स्ट्रिंग जहां जहां xxथे।
Arj

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