我正在尝试检查字符串是否包含两个以上的重复字符。
例如
'aabcd123' = ok
'aaabcd123' = not ok
'aabbab11!@' = ok
'aabbbac123!' = not ok
我尝试过这样的事,但没有运气
if (string.Distinct().Count() > 2){
//do something
}
任何帮助将不胜感激。
答案 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”这样的字符串工作,并且可以修改它们以确切地找出这些字符是什么,字符串中出现的位置等等(还允许您用其他字符替换这些子字符串)
更多信息:
答案 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