Ваша строка будет префикс с последующим в с последующим суффиксом.
Оба префикс и суффикс может быть нулевой длины. Если нет, они должны быть либо ровными, либо обеими неравномерными. Это означает, что у вас есть два основных случая.
EVENPREFIX a EVENSUFFIX | UNEVENPREFIX a UNEVENSUFFIX
Попробуйте это (неполными и неправильно):
([bc][bc])*a([bc][bc])*|([bc][bc][bc])*a([bc][bc][bc])*
Существует еще один неровный случай отсутствует: один [bc]
:
(([bc][bc])*a([bc][bc])*)|([bc]([bc][bc])*a[bc]([bc][bc])*)
Согласно http://www.fileformat.info/tool/regex.htm, это совпадения
Я ожидаю, что он соответствует остальным тоже ...
Левая сторона гарантирует даже (или пустые) последовательности b
или c
. Правой стороной является либо один b
, либо c
, за которым следует несколько из двух (чтобы он оставался неравномерным).
Коби придумал это уточнение выше:
([bc][bc])*(a|[bc]a[bc])([bc][bc])*
Как это работает?
Первой группе гарантировано быть четным. Вторая группа гарантированно будет неравномерной с одним a
внутри. Третья группа гарантированно будет четной. Таким образом, гарантируется, что все будет неравномерно.
Вы можете упростить это для '([bc] [bc]) * (a | [bc] a [bc]) ([bc] [bc]) *' - применять чередование только там, где оно вам нужно. – Kobi
Квадратные скобки не будут работать, потому что это означает, что нужно ровно один раз.Строка 'a' сама по себе должна быть допустимой строкой, поскольку она нечетна, ваше регулярное выражение не учитывает само по себе. – ubiquibacon
@ Kobi Право. Спасибо, что указали это. Это другой ход мыслей, хотя ... –