如何删除字符串中重复的字符
我有一个网站,允许用户评论照片。 当然,用户会留下以下评论:
‘OMGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG !!!!!!!!!!!!!!!’
要么
‘你SUCCCCCCCCCCCCCCCKKKKKKKKKKKKKKKKKK’
你懂了。
基本上,我想通过删除至少大多数重复多余的字符来缩短这些评论。 我确信有一种方法可以用Regex做到这一点。我只是想不出来。
有任何想法吗?
请记住,英语通常使用双字母,你可能不想盲目地消除它们。 这是一个正则表达式,将摆脱双重之外的任何东西。
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!!"
您是否特别希望缩短代码中的字符串,还是仅仅通过validation失败并再次向用户显示validation错误? 像“太多重复的人物”这样的东西。
如果后者是可接受的, @"(\w)\1{2}"
应匹配3或更多的字符(解释为“重复”两次或更多次)。
编辑:正如@Piskvor所指出的,这将匹配正好 3个字符。 它适用于匹配,但不适用于替换。 他的版本, @"(\w)\1{2,}"
,可以更好地替换。 但是,我想指出,我认为替换不是这里的最佳做法。 最好只是让表单失败validation而不是尝试擦除正在提交的文本,因为可能会出现边缘情况,您可以将其他可读(即使不合理)文本转换为无意义。
正则表达式会有点矫枉过正。 试试这个:
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
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); } );
编辑:糟糕的建议,请不要阅读,我真的值得我的-1 🙂
我在技术掘金中找到了类似于你所寻找的东西。
除了很长的正则表达式之外没什么可做的,因为我从来没有听说过重复的正则表达式……
这是一个完整的例子,我不会在这里粘贴它,但我认为这将完全回答你的问题。