Регулярные выражения
Лекция - экспромт!
Mastering Regular Expressions (aka Owl Book)
- Что такое
- Примеры сопоставления
- Поиск с заменой и обратные ссылки
Нерегулярные выражения — PCRE (нежадные повторители и пред/постпросмотр)
(если успеем) libpcre
Д/З
- Почитать про регулярные выражения
в документации (можно найти русский перевод)
(вообще смешного много)
Поискать The книгу
- Потренироваться! (обратите внимание на то, что большинство сайтов поддерживают Python или PCRE, или Javascript, но не классические RE).
Написать программу esub с параметрами regexp substitution string, которая работает примерно как echo 'string' | sed -E 's/regexp/substitution/' (однократная замена). Предупреждаю: надо уметь программировать на Си.
Используются расширенные регулярные выражения (так меньше «\»)
Программа должна распознавать ошибки в регулярном выражении и выводить соответствующую диагностику с помощью regerror
В строке substitution программа должна распознавать ссылки на соответствующие «карманы». Также должны распознаваться и ссылки на несуществующие карманы (например, \9 если в выражении нет стольких пар скобок — это ошибка), и конструкция «\\», которая должна заменяться на «\»
Следите за количеством этих «\» — оно имеет тенденцию уменьшаться вдвое при каждой обработке, да ещё в разных шеллах работать по-разному, не запутайтесь!
george@linuxprac:~> /bin/echo 123\456 123456 george@linuxprac:~> /bin/echo "123\456" 123\456 george@linuxprac:~> /bin/echo "123\\456" 123\456 george@linuxprac:~> /bin/echo "123\\\456" 123\\456 george@linuxprac:~> /bin/echo "123\\\\456" 123\\456 george@linuxprac:~> # а сейчас мерзкий трюк — echo, встроенный в Zsh george@linuxprac:~> echo "123\\\\456" 123\456 george@linuxprac:~> echo "123\\\\\\\\\\456" 123\\\456
Написать проект на autotools, cmake или meson, в который включить сборку, удаление генератов и тесты, где вывод esub сравнивается с выводом соответствующей команды sed -E s/…/…/
Создать в каталоге с домашними заданиями подкаталог 08_Regexps и поместить туда проект