2011-02-24 60 views
6

我想在C#中創建一個正則表達式,該字符串在重複時刪除特定字符,因此它不是字符串的最後一個字符。正則表達式來移除特定的重複字符

例子:

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

我從來沒有想要的 - 重複,我從來沒有想這是我的字符串的第一個或最後一個字符。我怎麼能寫一個正則表達式來做到這一點?

回答

14

大概是最容易做的這在兩個步驟。首先用一個「 - 」替換每個出現的一個或多個「 - 」,然後修剪任何前導/尾隨「 - 」。

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

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

只是FYI,'Trim()'接受「params」,所以你需要的只是'.Trim (' - ')' – 2011-02-24 23:55:05

+0

選擇類甚至是必需的嗎? ([]'s) – 2011-02-24 23:55:35

+0

可能不是,但我知道 - 在字符範圍內需要逃脫,而我不知道它是否在一個字符之外具有特殊含義。 – KeithS 2011-02-24 23:56:35

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 2011-02-24 23:51:47

+0

@Dmissmissile:我是個實用主義者。對我來說,解決問題遠比關心如何實際完成更重要。 **編輯**請參閱@ KeithS或@ LukeH對基於正則表達式的解決方案的回答。 – mellamokb 2011-02-24 23:53:48

+0

我理解你的思路......但我喜歡較短的代碼:) – Dismissile 2011-02-24 23:57:41

4

對於這個特定的問題,我可能會不使用正則表達式。相反,我可能會使用的String.SplitString.Join組合,這將是更簡單,更快的可能性:

像這樣:

string.Join("-", s.Split(new char[] {'-'}, StringSplitOptions.RemoveEmptyEntries)); 

隨着測試:

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 2011-02-25 00:11:47

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

+1,不錯的工作。很好的使用後視。 – 2011-02-25 00:05:00

+0

這是否會在開始處刪除破折號?我不這麼認爲。 – Stofke 2011-02-25 00:10:07

+2

@Stofke:是的,它的確如此。 – LukeH 2011-02-25 00:15:10

1

我知道你要的正則表達式,但你必須改變,或第二重讀,該代碼大多數人只是把它改寫,因爲它不必重新學習代碼的執行速度更快。使用內置字符串方法的2行將比重新讀取未來的正則表達式容易得多。在某些情況下速度更快。

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

這很接近,但它會將'--a-b --- c-'變成'a-b -c'。 – 2011-06-13 15:49:10