Определите, является ли строка четной или нечетной длины с регулярным выражением - PullRequest
6 голосов
/ 02 сентября 2010

У меня проблемы с построением регулярного выражения с набором строк более {a, b, c} длиной odd с точно одним a. Вот моя лучшая попытка:

(bb|bc|cb|cc)*a(bb|bc|cb|cc)*

Это хорошо для четных b и c по обе стороны от a, но не учитывает нечетные комбинации b и c по обе стороны от a.

Есть какие-нибудь намеки?

1 Ответ

4 голосов
/ 02 сентября 2010

Ваша строка будет иметь префикс , за которым следует a , за которым следует суффикс .

Оба префикс и суффикс могут иметь нулевую длину. Если нет, они должны быть как одинаковыми, так и неравномерными. Это означает, что у вас есть два основных случая.

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, это соответствует

  • a
  • cac
  • ccabb

Полагаю, это соответствует и остальным ...

Левая сторона гарантирует четные (или пустые) последовательности b или c. Правая сторона - это либо b, либо c, за которым следует кратное двум (так что оно остается неравномерным).

Коби придумал это уточнение выше:

([bc][bc])*(a|[bc]a[bc])([bc][bc])*

Как это работает?

Первая группа гарантированно будет четной. Вторая группа гарантированно будет неравномерной с одним a внутри. Третья группа гарантированно будет четной. Таким образом, целое гарантировано будет неравномерным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...