2011-06-04 11 views
8

मैं एक स्ट्रिंग इस एक के समान है:सी # उन्नत String.Split

लड़का अपनी मां से कहा, "मैं कुछ कैंडी मिल सकता है?"

तो मैं इस पर एक सामान्य String.Split करते हैं, मैं:

{ 'The', 'boy', 'said', 'to', 'his', 'mother', '"Can', 'I', 'have', 'some', 'candy?"' } 

मैं बहुत की तरह एक सरणी हैं:

{ 'The', 'boy', 'said', 'to', 'his', 'mother', 'Can I have some candy?' } 

जाहिर है, मैं कर सकता सिर्फ वर्ण दर वर्ण के माध्यम से लूप और इस बात का ट्रैक रखें कि मैं स्ट्रिंग में हूं या नहीं और वह सब ... लेकिन क्या कोई बेहतर तरीका है? शायद Regexs के साथ?

+0

पर विचार "कवच की तरह पार्स स्ट्रिंग" इस तरह की के लिए एक उपयोगी वाक्यांश के रूप में –

उत्तर

9

यह कैसे regex के सभी मैचों खोजने के बारे में:

"[^"]*"|\S+ 
+0

पूछना यह बहुत अच्छा है! एक और बात हालांकि ... यह से "कुछ मैं मिल सकता है उद्धरण दूर करने के लिए संभव है कैंडी? "मैच? – Entity

+3

@TheAdamGask इन्स: 'स्ट्रिंग.Trim (' '') '। – Ryan

2

अपनी आवश्यकताओं पर थोड़ा निर्भर करता है। जैसे क्या आपको एएए "बीबीबी (कोई रिक्त स्थान) सिग्नल शब्द या दो शब्दों के रूप में इलाज करने की आवश्यकता नहीं है? यदि एएए" बीबीबी एक शब्द है, और "केवल डेलीमीटर के बाद एक क्यूटेड फ़ील्ड शुरू करता है - यह सीएसवी पार्सर जैसा दिखता है। बेशक, सीएसवी में अन्य नियम, जैसे कि शाब्दिक उद्धरण आदि के लिए डबल क्यूउट्स की तरह - लेकिन आपको कुछ समान नियमों को भी परिभाषित करने की आवश्यकता होगी।

तो आप किसी भी ओपन सोर्स सीएसवी पार्सर को अनुकूलित कर सकते हैं या देख सकते हैं कि माइक्रोसॉफ्ट.विज़ुअल बेसिक.फाइलियो। टेस्टफिल्ल्ड पार्सर काम करता है के लिए आप

 string msg = "The boy said to his mother, \"Can I have some candy?\""; 
     System.IO.MemoryStream s = new System.IO.MemoryStream(Encoding.Unicode.GetBytes(msg)); 
     TextFieldParser p = new TextFieldParser(s, Encoding.Unicode); 
     p.Delimiters = new string[] { " ", "," }; 
     foreach(var f in p.ReadFields().Where(f => f != "")) 
      Console.WriteLine(f); 
संबंधित मुद्दे