2013-03-27 6 views
21

मैं Regex कक्षा में Split फ़ंक्शन का उपयोग करके एक स्ट्रिंग को विभाजित करना चाहता हूं। समस्या यह है कि को हटा देता है और मैं उन्हें रखना चाहता हूं। स्प्लिटे में अलग-अलग तत्वों के रूप में पसंदीदा रूप से।Regex के डिलीमीटर कैसे रखें। स्प्लिट?

other discussions के अनुसार जो मैंने पाया है, वहां प्राप्त करने के लिए केवल असुविधाजनक तरीके हैं।

कोई सुझाव?

+6

इनपुट स्ट्रिंग? आपका रेगेक्स? अपेक्षित उत्पादन? – I4V

+0

यह '.etc' अधिक जानकारी नहीं देता है। आपके एल्गोरिदम के बारे में लेकिन मैं कम से कम कोशिश कर सकता हूं। मेरा उत्तर देखें – I4V

+6

आप इतने आक्रामक क्यों हो जाते हैं? बस एक क्यूड सवाल पूछें और बेहतर जवाब प्राप्त करें। आप जो करना चाहते हैं उसे 'Regex.Split' के बिना भी किया जा सकता है। [यह] देखें (http://www.perlmonks.org/?node=xy+problem) और फिर मेरा जवाब पढ़ें। – I4V

उत्तर

59

बस एक पर कब्जा-समूह में पैटर्न रखा, और मैचों भी परिणाम में शामिल किया जाएगा।

string[] result = Regex.Split("123.456.789", @"(\.)"); 

परिणाम:

{ "123", ".", "456", ".", "789" } 

यह भी कई अन्य भाषाओं के लिए काम करता है:

  • जावास्क्रिप्ट: "123.456.789".split(/(\.)/g)
  • अजगर: re.split(r"(\.)", "123.456.789")
  • पर्ल: split(/(\.)/g, "123.456.789")

(नहीं जावा हालांकि)

+0

ओह, यह भी बेहतर था! मजेदार उदाहरण - आप किसी भी समय * किसी भी * से मेल खाते हैं कि ** वास्तव में ** एक अवधि है। एक महान वाक्यविन्यास के लिए +1! हालांकि, किसी कारण से यह अंतिम तत्व नहीं पकड़ता है, इसलिए मैंने जो कुछ कहा है, उसे प्राप्त करें लेकिन ** * 78 9 * भाग के लिए ** को छोड़कर। –

+0

पढ़ते समय आगे बढ़ते हुए, मैंने पढ़ा कि इसमें परिणाम शामिल नहीं हैं: Regex.Match ("25 मील अधिक कहें", @ "\ d + \ s (? = मील)"); // आउटपुट: 25 और एक अन्य कथन में कहा गया है कि अलग-अलग सकारात्मक रूप में पैटर्न को लपेटने के दौरान विभाजक को शामिल करने के लिए: Regex.Split ("oneTwoThree", @ "(? = [ए-जेड])"); // आउटपुट एक दो तीन उलझन में –

+1

@sortednoun देखो-आगे शून्य वर्णों से मेल खाता है, केवल तभी जब शरीर उस स्थिति से मेल खाता है। लुक-फॉर बॉडी मैच का हिस्सा नहीं है, इसलिए इसमें शामिल करने के लिए कुछ भी अतिरिक्त नहीं है। विभाजित होने पर शरीर द्वारा मिलान किए गए पाठ को अगले सरणी आइटम में शामिल किया जाएगा। '(? = ([ए-जेड])) 'दोनों पत्र के साथ एक अतिरिक्त आइटम बनायेंगे और इसे अगले आइटम में शामिल करेंगे। –

0

उन्हें वापस शामिल करें:

string[] Parts = "A,B,C,D,E".Split(','); 
    string[] Parts2 = new string[Parts.Length * 2 - 1]; 
    for (int i = 0; i < Parts.Length; i++) 
    { 
     Parts2[i * 2] = Parts[i]; 
     if (i < Parts.Length - 1) 
      Parts2[i * 2 + 1] = ","; 
    } 
+1

लेकिन यह इस मामले में काम नहीं करता है कि रेगेक्स में एक से अधिक संभावित मैच हैं। – AJMansfield

+1

यदि आप नहीं जानते कि डिलीमीटर का उपयोग किस प्रकार किया गया है तो आप क्या करते हैं? क्या आप हमारे लिए उदाहरण * Regex * कक्षा दोहरा सकते हैं? –

6

उपयोग Matches स्ट्रिंग में विभाजक को खोजने के लिए है, तो मूल्यों और विभाजक मिलता है।

उदाहरण:

string input = "asdf,asdf;asdf.asdf,asdf,asdf"; 

var values = new List<string>(); 
int pos = 0; 
foreach (Match m in Regex.Matches(input, "[,.;]")) { 
    values.Add(input.Substring(pos, m.Index - pos)); 
    values.Add(m.Value); 
    pos = m.Index + m.Length; 
} 
values.Add(input.Substring(pos)); 
+0

ओह, मुझे यह मिल गया। ठंडा। फिर भी, मेरी इच्छा है कि एक अतिरिक्त * स्प्लिट * होगा जो यह तय करने के लिए एक बूल लेता है कि क्या इसे डिलीमीटर रखना चाहिए। मुझे लगता है मुझे कोडिंग शुरू करनी होगी। धन्यवाद! एक स्पष्ट उत्तर के लिए +1। –

3

कहो कि इनपुट "abc1defg2hi3jkl" है और regex अंक बाहर लेने के लिए है।

String input = "abc1defg2hi3jkl"; 
var parts = Regex.Matches(input, @"\d+|\D+") 
      .Cast<Match>() 
      .Select(m => m.Value) 
      .ToList(); 

पार्ट्स होगा: abc1defg2hi3jkl

संबंधित मुद्दे