我需要验证序列号,其中一条规则是允许最多5个连续的相等字符。
示例有效:
012W212222123 // 4x the digit 2 contiguous
示例无效:
012W764444443 // 6x the digit 4
所以我试图获得最大数量的连续字符而没有成功
int maxCount = "012W764444443".GroupBy(x => x).Max().Count();
答案 0 :(得分:4)
我建议使用正则表达式检查是否有5个或更多连续数字:
Regex.IsMatch(input, @"^(?!.*([0-9])\1{4})")
如果有任何字符:
Regex.IsMatch(input, @"^(?!.*(.)\1{4})")
请参阅regex demo
正则表达式在字符串中找到匹配项,该字符串包含少于5个相同的连续数字(带有[0-9]
的版本)或除换行符之外的任何字符(带有.
的版本)。
<强>详情:
^
- 字符串的开头
- (?!.*(.)\1{4})
- 如果匹配模式,则会导致匹配失败的否定前瞻:
.*
- 除换行符之外的任何0 +字符(.)
- 第1组捕获任何字符但是换行符\1{4}
- 恰好4个连续出现在第1组中的相同值(其中\1
是backreference而{4}
是一个range/bound/limiting quantifier)。C#:
var strs = new List<string> { "012W212222123", "012W764444443"};
foreach (var s in strs)
Console.WriteLine("{0}: {1}", s, Regex.IsMatch(s, @"^(?!.*(.)\1{4})"));
答案 1 :(得分:2)
另一种选择是使用此功能:
public static int MaxNumberOfConsecutiveCharacters(string s)
{
if (s == null) throw new ArgumentNullException(nameof(s));
if (s.Length == 0) return 0;
int maxCount = 1;
int count = 1;
for (int i = 1; i < s.Length; i++)
{
if (s[i] == s[i-1])
{
count++;
if (count > maxCount) maxCount = count;
}
else
{
count = 1;
}
}
return maxCount;
}
显然,这比正则表达式要多得多。根据您对正则表达式的了解,这可能会或可能不会对您更具可读性。此外,这可能比使用正则表达式更有效,正则表达式可能对您很重要,也可能不重要。
答案 2 :(得分:2)
效率有点低,但这很有效:
var max =
"012W212222123"
.Aggregate(
new { Char = ' ', Count = 0, Max = 0 },
(a, c) =>
a.Char == c
? new { Char = c, Count = a.Count + 1, Max = a.Max > a.Count + 1 ? a.Max : a.Count + 1 }
: new { Char = c, Count = 1, Max = a.Max > 1 ? a.Max : 1 })
.Max;
我尝试了两个输入并且每次都获得了正确数量的最大重复次数。