regex / linq用count替换连续的字符

时间:2010-12-09 13:00:30

标签: c# regex linq

我有以下方法(用C#/ .NET编写)。输入文本仅包含字母(无数字)。返回值是另一个文本,其中两个以上连续字符的组被替换为一个前面带有重复计数的字符。 例如:aAAbbbcccc - > aAA3b4c

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?

1 个答案:

答案 0 :(得分: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]);   
}

正则表达式是一个单词char,然后是相同的(反向引用)至少两次; lamba获取匹配的长度(match.Length)并附加第一个字符(match.Value[0]