Как удалить повторяющиеся символы в строке

У меня есть сайт, который позволяет пользователям комментировать фотографии. Конечно, пользователи оставляют комментарии типа:

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

или

- ВЫ SUCCCCCCCCCCCCCCCCCKKKKKKKKKKKKKKKKKK'

вы получили это.

в основном, я хочу сократить эти комментарии, удалив, по крайней мере, большинство из этих излишков повторяющиеся символы. Я уверен, что есть способ сделать это с Regex..я просто не могу понять.

какие идеи?

7 ответов


имея в виду, что английский язык часто использует двойные буквы, вы, вероятно, не хотите слепо их устранять. Вот регулярное выражение, которое избавится от всего, кроме двойника.

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!!"

вы специально хотите сократить строки в коде, или было бы достаточно просто провалить проверку и представить форму пользователю снова с ошибкой проверки? Что-то вроде "слишком много повторяющихся символов."

Если последнее допустимо, @"(\w){2}" должен соответствовать символам 3 или более (интерпретируется как" повторяется " два или более раз).

Edit: как отметил @Piskvor, это будет соответствовать на ровно 3 символов. Он отлично работает для сопоставления, но не для замены. Его версия,@"(\w){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();
    }

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

Distinct () удалит все дубликаты, однако он не будет видеть "A" и "a" как то же самое, очевидно.

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

Выходы "Asdfa"


var test = "OMMMMMGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGMMM";

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

Edit: ужасное предложение, пожалуйста, не читайте, Я действительно заслуживаю моего -1:)

Я нашел здесь на техническая самородков что-то вроде того, что вы ищете.

делать нечего, кроме очень длинного регулярного выражения, потому что я никогда не слышал о знаке регулярного выражения для повторения ...

Это общий пример, я не буду вставлять его здесь, но я думаю, что это полностью ответит на ваш вопрос.