2011-02-24 22 views
6

मैं सी # में एक रेगेक्स बनाना चाहता हूं जो एक विशिष्ट चरित्र को दोहराया जाता है और इसलिए यह स्ट्रिंग का अंतिम अक्षर नहीं है।एक विशिष्ट दोहराए गए चरित्र को हटाने के लिए Regex

उदाहरण:

"a--b-c-" => "a-b-c" 
"-a-b--c" => "a-b-c" 
"--a--b--c--" => "a-b-c" 

मैं कभी नहीं चाहते हैं - बार-बार, और मैं इसे कभी नहीं मेरी श्रृंखला का पहला या अंतिम वर्ण होना चाहता हूँ। ऐसा करने के लिए मैं एक रेगेक्स कैसे लिख सकता हूं?

उत्तर

14

शायद सबसे आसान:

string.Join("-", s.Split(new char[] {'-'}, StringSplitOptions.RemoveEmptyEntries)); 
परीक्षण के साथ

:

इस तरह

यह दो चरणों में है। सबसे पहले एक या अधिक के साथ एक या अधिक "-" की प्रत्येक घटना को प्रतिस्थापित करें, फिर किसी भी अग्रणी/पीछे की ओर ट्रिम करें।

var reducedString = Regex.Replace(inputString, "-+", "-"); 

var finalString = reducedString.Trim('-'); 
+0

पर पसंद करता हूं बस एफवाईआई, 'ट्रिम()' पैरा "स्वीकार करता है, इसलिए आपको बस इतना चाहिए। ('-') ' –

+0

क्या चयन वर्ग भी आवश्यक है? ([]) –

+0

शायद नहीं, लेकिन मुझे पता था कि - एक चरित्र सीमा में बचने की जरूरत है, जबकि मुझे नहीं पता था कि इसका एक विशेष अर्थ था या नहीं। – KeithS

0

यह नियमित अभिव्यक्तियों के बिना आसान हो सकता है। निम्नलिखित (अवांछित) की तरह कुछ:

string s = "--a--b--c--"; 
string t = ""; 

bool atStart = true; 
bool inHyphen = false; 

foreach (char c in s) { 
    if (c != "-") { 
     if (atStart) { 
      atStart = false; 
     } else if (inHyphen) { 
      inHyphen = false; 
      t += "-"; 
     } 
     t += c; 
    } else { 
     inHyphen = true; 
    } 
} 
+0

मैंने रेगेक्स के लिए पूछा, अन्यथा मैं आपका जवाब स्वीकार करूंगा। – Dismissile

+0

@ डिस्मिसाइल: मैं एक व्यावहारिक हूं। समस्या को हल करने के लिए वास्तव में यह वास्तव में किए जाने की देखभाल करने से कहीं अधिक महत्वपूर्ण है। ** संपादित करें ** Regex- आधारित समाधान के लिए @ कीथ्स या @ ल्यूकएच का जवाब देखें। – mellamokb

+0

मैं आपकी सोच की रेखा को समझता हूं ... लेकिन मुझे छोटे कोड पसंद हैं :) – Dismissile

4

इस विशिष्ट समस्या के लिए, शायद मैं रेगेक्स का उपयोग नहीं करता। इसके बजाय, मैं शायद String.Split और String.Join का एक संयोजन है, जो सरल और हो जाएगा का उपयोग करेंगे संभावना तेजी से:

using System; 
class Program 
{ 
    static string RemoveDashes(string s) 
    { 
     return string.Join("-", s.Split(new char[] { '-' }, 
          StringSplitOptions.RemoveEmptyEntries)); 
    } 
    static void Main(string[] args) 
    { 
     Tuple<string, string>[] tests = new Tuple<string,string> [] 
     { 
      new Tuple<string, string> ("a--b-c-", "a-b-c"), 
      new Tuple<string, string> ("-a--b-c-", "a-b-c"), 
      new Tuple<string, string> ("--a--b--c--", "a-b-c"), 
     }; 
     foreach (var t in tests) 
     { 
      string s = RemoveDashes(t.Item1); 
      Console.WriteLine("{3}: {0} => Expected: {1}, Actual: {2}", 
         t.Item1, t.Item2, s, s == t.Item2 ? "PASS" : "FAIL"); 
     } 
    } 
} 
+1

रचनात्मक समाधान, मैं वास्तव में इसे रेगेक्स – Stofke

3
string tidyText = Regex.Replace(originalText, "^-+|(?<=-)-+|-+$", ""); 
+0

+1, अच्छी नौकरी। देखो-पीछे का अच्छा उपयोग। –

+0

क्या यह शुरुआत में अंत में डैश को हटा देता है? मुझे ऐसा नहीं लगता। – Stofke

+2

@Stofke: हाँ, यह करता है। – LukeH

1

मैं तुम्हें Regex के लिए कहा है, लेकिन दूसरा आप बदल सकते हैं या करने के लिए है फिर से पढ़ें, कि कोड अधिकांश लोग बस यह पुनर्लेखन क्योंकि यह दोबारा सीखने की, जो कोड के कर होने की तुलना में तेजी है। अंतर्निहित स्ट्रिंग विधियों का उपयोग करके 2 लाइनें भविष्य में regex को फिर से पढ़ने की तुलना में बहुत आसान हो जाएंगी। और यह कुछ मामलों में तेजी से है।

 string text = "--a-b--c-"; 
     text = text.Replace("--", "-"); 
     text = text.Trim('-'); 
+0

यह करीब है, लेकिन यह '-a-b --- c-' को 'ए-बी-सी' में बदल देगा। –

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