2010-09-02 2 views
6

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

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

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

Любые подсказки?

ответ

4

Ваша строка будет префикс с последующим в с последующим суффиксом.

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

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 внутри. Третья группа гарантированно будет четной. Таким образом, гарантируется, что все будет неравномерно.

+1

Вы можете упростить это для '([bc] [bc]) * (a | [bc] a [bc]) ([bc] [bc]) *' - применять чередование только там, где оно вам нужно. – Kobi

+0

Квадратные скобки не будут работать, потому что это означает, что нужно ровно один раз.Строка 'a' сама по себе должна быть допустимой строкой, поскольку она нечетна, ваше регулярное выражение не учитывает само по себе. – ubiquibacon

+0

@ Kobi Право. Спасибо, что указали это. Это другой ход мыслей, хотя ... –

Смежные вопросы