Я предлагаю использовать регулярное выражение для проверьте, есть ли 5 или более последовательных цифр:
Regex.IsMatch(input, @"^(?!.*([0-9])\1{4})")
Если какие-либо символы предназначены:
Regex.IsMatch(input, @"^(?!.*(.)\1{4})")
См regex demo
Регулярное выражение находит совпадение в строке, которая содержит менее чем 5 одинаковых последовательных цифр (версия с [0-9]
) или любые символы кроме новой строки (версия с .
).
Детали:
^
- начало строки - (?!.*(.)\1{4})
- отрицательный предпросмотр, который не проходит матч, если шаблон сопоставляется:
.*
- любые 0+ другие, чем CHARS newline
(.)
- Группа 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})"));
Почему бы не использовать регулярное выражение для этого? 'Regex.IsMatch (ввод, @ "^ (?!. * ([0-9]) \ 1 {4})") '? Если вам нужно проверить * любые * символы, а не только цифры, используйте '.' вместо' [0-9] ' –
Для дальнейшего уточнения -' GroupBy' не будет работать, потому что он будет группировать * все * символы в string, а не только те, которые находятся рядом друг с другом. Если вы не хотите создавать свою собственную версию группировки, которая также учитывает позицию, правильно сформированное регулярное выражение, как было предложено Wiktor, было бы проще. – kiziu