К счастью, регулярные выражения .NET способны обрабатывать бесконечные объекты.То, что вам нужно, может быть достигнуто с помощью следующего регулярного выражения:
((?>(?(2)(?=\2))(.)\2)+)(?<!\2\1)(?!\2)
См. живую демонстрацию здесь
Распределение регулярных выражений:
(
Начало группы захвата # 1 (?>
Начало группы без захвата (атомарный) (?(2)
Если установлена группа захвата # 2 (?=\2)
Следующим символом должен быть
)
Конец f условно (.)\2
Совпадение и захват символа и сопоставление его снова (четное число)
)+
Повторять как можно больше, по крайней мере, один раз
)
Конец группы захвата # 1 (?<!\2\1)
Вот трюк.Взгляд назад сообщает движку, что непосредственно предшествующий символ, который предшествует тому, что мы до сих пор сопоставляли, не должен быть тем же самым символом, хранящимся в группе захвата # 2 (?!\2)
Следующий символ не должен совпадать ссимвол хранится в группе захвата # 2
ОБНОВЛЕНИЕ:
Таким образом, вы можете выполнить следующий код в C #, чтобы получить все четные последовательности символов в строке на Regex
без каких-либо других операторов (чистый Regex).
var allEvenSequences = Regex.Matches("aaabbashasccddee", @"((?>(?(2)(?=\2))(.)\2)+)(?<!\2\1)(?!\2)").Cast<Match>().ToList();
Также, если вы хотите сделать [bb],[cc],[dd],[ee]
, вы можете присоединиться к этому массиву последовательностей:
string strEvenSequences = string.Join(",", allEvenSequence.Select(x => $"[{x}]").ToArray());
//strEvenSequences will be [bb],[cc],[dd],[ee]