如何检查字符串是否有两个以上的重复字符

时间:2013-01-31 20:24:45

标签: c# string duplicates

我正在尝试检查字符串是否包含两个以上的重复字符。

例如

'aabcd123' = ok
'aaabcd123' = not ok
'aabbab11!@' = ok
'aabbbac123!' = not ok

我尝试过这样的事,但没有运气

if (string.Distinct().Count() > 2){ 
                    //do something
                }

任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:11)

这个对我有用:

public bool  IsOK(string s)
{
  if(s.Length < 3) return true;

  return !s.Where((c,i)=> i >= 2 && s[i-1] == c && s[i-2] == c).Any();
}

'aabcd123'     : OK
'aaabcd123'    : not OK
'aabbab11!@'   : OK
'aabbbac123!'  : not OK

答案 1 :(得分:8)

仅为经典循环着想:

public bool HasRepeatingChars(string str)
{
    for(int i = 0; i < str.Length - 2; i++)
        if(str[i] == str[i+1] && str[i] == str[i+2])
            return true;
    return false;
}

答案 2 :(得分:2)

您可以使用正则表达式:

return Regex.IsMatch(inputString, @"(.)\1{2,}", RegexOptions.IgnoreCase)

这将检查任何字符,然后至少检查相同字符的2倍。甚至可以使用像“AaA”这样的字符串工作,并且可以修改它们以确切地找出这些字符是什么,字符串中出现的位置等等(还允许您用其他字符替换这些子字符串)

更多信息:

http://msdn.microsoft.com/en-us/library/6f7hht7k.aspx

http://msdn.microsoft.com/en-us/library/az24scfc.aspx

答案 3 :(得分:1)

由于您希望在字符串中找到三个字符而不仅仅是三个字符的运行,因此您需要循环查看三个连续字符以查看它们是否相同。像这样的循环可以工作。

string myString = "aaabbcd";
bool hasMoreThanTwoRepeatingCharsInARow = false;
for(int index = 2; index < myString.Length; index++)
{
  if(myString[index] == myString[index - 1] && myString[index] == myString[index - 2])
  {
    hasMoreThanTwoRepeatingCharsInARow = true;
  }
}

我会坚持使用这种方法,让变量变得更好,你就可以了!

答案 4 :(得分:1)

    [TestMethod]
    public void Test()
    {
        const string sample1 = "aabcd123";
        const string sample2 = "aaabcd123";
        const string sample3 = "aabbab11!@";
        const string sample4 = "aabbbac123!";

        Assert.IsTrue(IsOk(sample1));
        Assert.IsFalse(IsOk(sample2));
        Assert.IsTrue(IsOk(sample3));
        Assert.IsFalse(IsOk(sample4));
    }

    private bool IsOk(string str)
    {
        char? last = null;
        var i = 1;
        foreach (var c in str)
        {
            if (last == c)
            {
                i++;
                if (i > 2) return false;
            }
            else
            {
                i = 1;
            }
            last = c;
        }
        return true;
    }

答案 5 :(得分:0)

使用正则表达式

(?:.*<letter>.*){2}

例如,对于字母 b,您将使用

(?:.*b.*){2}

对于所有元音

 (?:.*[aeiou].*){2}

有关 c# 上的正则表达式用法,请参阅 https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex?view=net-5.0