如何删除字符串中重复的字符

时间:2010-12-13 14:49:13

标签: c# regex string

我有一个网站,允许用户评论照片。 当然,用户会留下以下评论:

  

'OMGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG !!!!!!!!!!!!!!!'

  

'你SUCCCCCCCCCCCCCCCKKKKKKKKKKKKKKKKK'

你明白了。

基本上,我想通过删除至少大部分多余的重复字符来缩短这些评论。 我确信有一种方法可以用Regex做到这一点......我无法理解它。

有什么想法吗?

7 个答案:

答案 0 :(得分:9)

请记住,英语通常使用双字母,你可能不想盲目地消除它们。这是一个正则表达式,可以摆脱双重的任何东西。

Regex r = new Regex("(.)(?<=\\1\\1\\1)", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled);

var x = r.Replace("YOU SUCCCCCCCCCCCCCCCCCKKKKKKKKKKKKKKKKKK", String.Empty);
// x = "YOU SUCCKK"

var y = r.Replace("OMGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG!!!!!!!!!!!!!!!", String.Empty);
// y = "OMGG!!"

答案 1 :(得分:8)

您是否特别希望缩短代码中的字符串,还是仅仅通过验证失败并再次向用户显示验证错误?像“太多重复的人物”这样的东西。

如果后者可以接受,@"(\w)\1{2}"应匹配3或更多的字符(解释为“重复”两次或更多次)。

编辑:正如@Piskvor所指出的,这将匹配完全 3个字符。它适用于匹配,但不适用于替换。他的版本@"(\w)\1{2,}"可以更好地替换。但是,我想指出,我认为替换不是这里的最佳做法。更好的方法是让表单失败验证而不是尝试擦除正在提交的文本,因为可能会出现边缘情况,您可以将其他可读(即使不合理)文本转换为废话。

答案 2 :(得分:2)

正则表达式会有点矫枉过正。 试试这个:

public static string RemoveRepeatedChars(String input, int maxRepeat)
    {
        if(input.Length==0)return input;

        StringBuilder b = new StringBuilder;
        Char[] chars = input.ToCharArray();
        Char lastChar = chars[0];
        int repeat = 0;
        for(int i=1;i<input.Length;i++){
            if(chars[i]==lastChar && ++repeat<maxRepeat)
            {
                b.Append(chars[i]);
            }
            else
            {
                b.Append(chars[i]);
                repeat=0;
                lastChar = chars[i];
            }
        }
        return b.ToString();
    }

答案 3 :(得分:1)

var nonRepeatedChars = myString.ToCharArray().Distinct().Where(c => !char.IsWhiteSpace(c) || !myString.Contains(c)).ToString();

答案 4 :(得分:0)

编辑:糟糕的建议,请不要阅读,我真的应该得到我的-1:)

我在technical nuggets找到了类似于你所寻找的东西。

除了很长的正则表达式之外没什么可做的,因为我从来没有听说过重复的正则表达式......

这是一个完整的例子,我不会在这里粘贴,但我认为这将完全回答你的问题。

答案 5 :(得分:0)

Distinct()将删除所有重复项,但显然不会看到“A”和“a”相同。

Console.WriteLine(new string("Asdfasdf".Distinct().ToArray()));

输出“Asdfa”

答案 6 :(得分:0)

var test = "OMMMMMGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGMMM";

test.Distinct().Select(c => c.ToString()).ToList()
        .ForEach(c =>
            { 
                while (test.Contains(c + c)) 
                test = test.Replace(c + c, c); 
            }
        );