Найти самую длинную последовательность, состоящую из одинаковых символов при помощи Regular Expressions
Мне нужно в определенной строке найти самую длинную последовательность, состоящую из одинаковых символов используя только Regular Expressions. Возможно ли вообще это сделать?
Пример: найти длину максимальной цепочки, состоящей из символов С
string s = "AACCCCJDKSJKACCCCCK";
int max = // TODO: some code
Console.WriteLine(max); //5
Ответы (2 шт):
Автор решения: Alexander Petrov
→ Ссылка
Могу предложить следующее:
string s = "AACCCCJDKSJKACCCCCK";
int max = 0;
var regex = new Regex(@"(.)\1*");
foreach (Match match in regex.Matches(s))
{
if (max < match.Value.Length)
max = match.Value.Length;
}
Console.WriteLine(max); //5
Используем группировку с обратной связью.
(.) - группа, находящая один любой символ
\1 - совпадение с ранее найденной группой под номером 1
* - любое количество раз
Никаких особых преимуществ от использования регулярок тут нет. Всё равно приходится использовать цикл.
Автор решения: aepot
→ Ссылка
static void Main(string[] args)
{
string text = "AACCCCJDKSJKACCCCCK";
var sequences = Regex.Matches(text, @"(\w)\1*").Select(m => m.Value);
Console.WriteLine(string.Join(Environment.NewLine, sequences.Select((x, i) => $"{i}: {x}")));
int max = sequences.Select(x => x.Length).Max();
Console.WriteLine($"Max: {max}");
Console.ReadKey();
}
Вывод в консоль
0: AA
1: CCCC
2: J
3: D
4: K
5: S
6: J
7: K
8: A
9: CCCCC
10: K
Max: 5
Ну а если прямо ответить без демонстрации, то
int max = Regex.Matches(s, @"(\w)\1*").Select(m => m.Value.Length).Max();