Регулярные выражения на сложном примере

Я столкнулся с задачей: Надо написать проверку, что перед каждым символом ‘a’ в строке находится нечётное число символов. Например, для строк ‘b’ и ‘ba’ эта проверка должна выдавать true, а для строк ‘a’ и ‘aa’ — false.

Начнем решать эту задачу поэтапно, так как ее решение выглядит следующим образом

Понять его сразу довольно сложно, а некоторые пишут, что смотреть чужие решения по регулярным выражениям и вовсе бессмысленно, так как их не прочитать. Но я хочу развеять этот миф и покажу вам, как прочитать данное решение или как к нему придти за 15 минут.

Итак, начнем. Первое, что нужно сделать – это разобраться с элементарными вещами, а именно:

Подробнее можно прочитать в списке литературы и особенно тут.

Двигаемся дальше. Нам нужно создать шаблон, который будет удовлетворять любому числу любых нечетных букв, находящемуся перед одной буквой а для начала. Для этого можно воспользоваться следующим приемом: создаем шаблон для четного числа букв и добавляем еще одну букву.

Согласно обозначениям сверху, следующая запись означает, что шаблон требует 2 любые буквы, кроме а.

Теперь объединяем эту запись в круглые скобки и ставим после нее звездочку. Это означает, что теперь 2 буквы кроме буквы а могут встречаться любое число раз, включая ноль:

Если мы перед предыдущей записью добавим еще одну букву, не равную а в обязательном порядке, то мы получим в итоге шаблон, который требует либо 1 букву, либо нечетное их число:

Допишем букву а в конце, это означает, что перед а – любое нечетное число букв и сама буква а добавилась:

Список использованных ссылок:

  1. http://www.learn-javascript-tutorial.com/RegularExpressions.cfm
  2. http://www.regular-expressions.info/javascriptexample.html – Инструмент для тестирования выражений
  3. http://www.javascriptkit.com/javatutors/re.shtml
  4. http://www.sql.ru/forum/actualthread.aspx?bid=34&tid=858526
  5. http://www.codeproject.com/KB/dotnet/regextutorial.aspx
  6. – самая полезная для меня статья оказалась

  7. http://msdn.microsoft.com/ru-ru/library/28hw3sce.aspx
  8. http://www.rsdn.ru/article/alg/regular.xml
  9. http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx
  10. http://www.intuit.ru/department/ds/discrmath/1/ – немного дискретной математики и потом идет курс по конечным автоматам, полезно почитать

Leave a Reply

Your email address will not be published. Required fields are marked *