Проект «Регулярные выражения»

Реализовать функцию сравнения с простым набором регулярных выражений и программу поиска вхождений соотв. выражений в файле или входном потоке (упрощенный аналог grep).

Минимальный набор регулярных выражений для реализации:

Одиночный символ:

  • c — присутствует c -- конкретный символ набора ASCII
  • [a-z] — любой символ из диапазона символов (здесь от "a" до "z")
  • [abd] — присутствует любой символ из списка (здесь a, b, d)
  • [^abe] — не является ни одним из символов списка (a, b, e)
  • комбинация перечислений, диапазонов, отрицания
  • . — любой символ

Последовательность символов:

  • * — предыдущий одиночный символ символ повторяется любое число раз (или ни разу)
  • + — предыдущий одиночный символ символ повторяется один или больше раз
  • ? — предыдущий одиночный символ символ повторяется один раз или ни разу

Ограничители:

  • ^ — начало строки
  • $ — конец строки

Для использования "служебных" символов (\[.+*?$^\]) в виде "конкретного символа" перед ними нужно поставить символ исключения \, то же самое касается самого символа \.

Реализация других выражения из POSIX набора ({m,n},\>,|< и проч.) приветствуется, но не обязательна.

Программа поиска ищет в файле/потоке строки, соответствующие рег. выражению и выводит их целиком с номером строки в файле (в потоке).

Пример:

  • выражению abc соответствуют строки "abcd", "cabcab",
  • выражению ^abc -- только первая "abcd".

  • выражению [a-z]a+ соответствуют строки "zaaaaaaaaaaaaa", "rkbaa"

  • выражению ^ +if[ ]*([^)]+)[ ]*{$ соответствуют: " if(a) {", " if ( !x ){". При этом строка " if ( !(x) ){" не соответствует.