我正在尝试检查一个字符串是否包含两个以上的重复字符。
例如
'aabcd123' = ok
'aaabcd123' = not ok
'aabbab11!@' = ok
'aabbbac123!' = not ok
我试过这样的东西,但没有运气
if (string.Distinct().Count() > 2){
//do something
}
任何帮助,将不胜感激。
我正在尝试检查一个字符串是否包含两个以上的重复字符。
例如
'aabcd123' = ok
'aaabcd123' = not ok
'aabbab11!@' = ok
'aabbbac123!' = not ok
我试过这样的东西,但没有运气
if (string.Distinct().Count() > 2){
//do something
}
任何帮助,将不胜感激。
这个对我有用:
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
只是为了经典循环:
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;
}
您可以为此使用正则表达式:
return Regex.IsMatch(inputString, @"(.)\1{2,}", RegexOptions.IgnoreCase)
这将检查任何字符,然后检查至少 2 次相同的字符。甚至可以使用诸如“AaA”之类的字符串,并且可以进行修改以准确找出这些字符是什么,它们在字符串中出现的位置等等(还允许您用其他内容替换这些子字符串)
更多信息:
由于您要查找三个字符的运行,而不仅仅是字符串中的三个字符,因此您需要循环并查看三个连续的字符以查看它们是否相同。像这样的循环将起作用。
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;
}
}
我会坚持这个方法并使变量更好,你很高兴!
[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;
}
使用正则表达式
(?:.*<letter>.*){2}
例如,对于字母 b,您将使用
(?:.*b.*){2}
对于所有元音
(?:.*[aeiou].*){2}
有关 c# 上的正则表达式用法,请参阅https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex?view=net-5.0