Как удалить повторяющиеся символы в строке
У меня есть сайт, который позволяет пользователям комментировать фотографии. Конечно, пользователи оставляют комментарии типа:
'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:)
Я нашел здесь на техническая самородков что-то вроде того, что вы ищете.
делать нечего, кроме очень длинного регулярного выражения, потому что я никогда не слышал о знаке регулярного выражения для повторения ...
Это общий пример, я не буду вставлять его здесь, но я думаю, что это полностью ответит на ваш вопрос.