2010-12-09 5 views
2

J'ai la méthode suivante (écrite en C# /. NET). Le texte d'entrée est composé uniquement de lettres (pas de chiffres). La valeur renvoyée est un autre texte dans lequel les groupes de plus de deux caractères consécutifs sont remplacés par un caractère précédé d'un nombre de répétitions. Ex .: aAAbbbcccc -> aAA3b4cregex/linq pour remplacer les caractères consécutifs par le nombre

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(); 
} 

La méthode est pas trop long. Mais quelqu'un a-t-il une idée de comment faire cela de manière plus concise en utilisant regex? Ou LINQ?

+0

Je le laisserais tel quel. Une solution Linq ou Regex sera plus déroutante pour la plupart des gens à lire. – juharr

+0

@juharr vraiment? même comparé au 1-liner? –

+0

@Marc Malheureusement, beaucoup de programmeurs n'ont qu'une compréhension élémentaire de Regex. Avec des commentaires appropriés, ça serait OK. – juharr

Répondre

4

Que diriez-vous:

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]); 
} 

Le regex est un mot char, suivi par le même (back-ref) au moins deux fois; le lamba prend la longueur du match (match.Length) et ajoute le premier caractère (match.Value[0])

Questions connexes