2010-12-09 98 views
2

我有以下方法(用C#/。NET編寫)。輸入文本僅包含字母(無數字)。返回值是另一個文本,在該文本中,超過兩個連續字符的組被替換爲一個字符,後面是重複次數。 例:aAAbbbcccc - > aAA3b4c正則表達式/ linq替換連續字符與計數

public static string Pack(string text) 
{ 
    if (string.IsNullOrEmpty(text)) return text; 

    StringBuilder sb = new StringBuilder(text.Length); 

    char prevChar = text[0]; 
    int prevCharCount = 1; 

    for (int i = 1; i < text.Length; i++) 
    { 
     char c = text[i]; 
     if (c == prevChar) prevCharCount++; 
     else 
     { 
      if (prevCharCount > 2) sb.Append(prevCharCount); 
      else if (prevCharCount == 2) sb.Append(prevChar); 
      sb.Append(prevChar); 

      prevChar = c; 
      prevCharCount = 1; 
     } 
    } 

    if (prevCharCount > 2) sb.Append(prevCharCount); 
    else if (prevCharCount == 2) sb.Append(prevChar); 
    sb.Append(prevChar); 

    return sb.ToString(); 
} 

的方法是不是太長。但是,有沒有人有一個想法如何使用正則表達式更簡潔的方式?還是LINQ?

+0

我會保持原樣。對於大多數人來說,Linq或Regex解決方案會更令人困惑。 – juharr 2010-12-09 13:21:52

回答

4

如何:

static readonly Regex re = new Regex(@"(\w)(\1){2,}", RegexOptions.Compiled); 
static void Main() { 
    string result = re.Replace("aAAbbbcccc", 
     match => match.Length.ToString() + match.Value[0]); 
} 

正則表達式是一個字字符,接着是相同(背REF)至少兩次;蘭巴需要匹配的長度(match.Length)並追加第一個字符(match.Value[0]