3

文字列に3つ以上の繰り返し文字が含まれているかどうかを確認しようとしています。

例えば

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

私はこのようなことを試しましたが、運がありません

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

どんな助けでもいただければ幸いです。

4

6 に答える 6

12

これは私のために働いた:

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
于 2013-01-31T20:37:08.350 に答える
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;
}
于 2013-01-31T20:37:56.060 に答える
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

于 2013-01-31T20:45:04.090 に答える
1

文字列内の3文字だけでなく、3文字のランを検索する必要があるため、ループして3つの連続する文字を調べ、それらが同じであるかどうかを確認する必要があります。このようなループは機能します。

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;
  }
}

私はこれをメソッドに固執し、変数をより良くするでしょう、そしてあなたは行ってもいいです!

于 2013-01-31T20:36:21.133 に答える
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;
    }
于 2013-01-31T20:55:23.793 に答える
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を参照してください。

于 2021-05-01T17:02:20.517 に答える