- •Министерство образования и науки российской федерации
- •Обработка текстов с использованием регулярных выражений
- •305040, Г.Курск, ул. 50 лет Октября, 94. Содержание
- •Введение
- •1. Цель работы
- •2. Необходимое программное обеспечение
- •3. Теоретическая часть
- •3.1. Зачем нужны регулярные выражения
- •3.2. Регулярные выражения: что это такое?
- •3.3. Синтаксис регулярных выражений
- •3.3.1. Метасимволы
- •Значения метасимволов
- •Последовательности метасимволов
- •3.3.2. Символьные классы
- •3.3.3. Квантификаторы
- •Квантификаторы
- •3.3.4. О квантификаторах: жадных и ленивых
- •«Жадные» и «ленивые» варианты квантификаторов
- •3.3.6. Обратные ссылки
- •3.3.7. Модификаторы
- •Модификаторы
- •3.4. Как оно всё работает
- •3.5. Чего не умеют регулярные выражения
- •4. Использование библиотеки RegExpr
- •4.1. Как делается поиск подстрок
- •4.2. Как делается поиск и замена
- •5. Порядок выполнения работы
- •6. Содержание отчета
- •7. Контрольные вопросы
- •Библиографический список
- •Варианты заданий
1. Цель работы
Разобраться с концепцией и синтаксисом регулярных выражений, научиться их составлять и эффективно применять для обработки текстов.
2. Необходимое программное обеспечение
1. Среда разработки С++ Builder 6.0 или Delphi 7.0
2. Библиотека RegExpr (можно взять на сервере кафедры ВТ в папке «PUBLIC\Системное ПО\Лабы\Регулярные выражения» или скачать в интернете).
3. Файл с электронной документацией (описанием библиотеки RegExpr) на русском языке REGEXPRU.HLP или на английском REGEXPE.HLP (можно взять там же).
Данная методичка сделана как понятное дополнение к электронной документации, поэтому не исключает изучения первоисточника (то есть файла HLP и дистрибутива библиотеки).
3. Теоретическая часть
3.1. Зачем нужны регулярные выражения
Допустим, вы пишите некую программу, которая запрашивает от пользователя номер телефона. И нужно сделать «защиту от дурака», запрещая ввод некорректных данных. «Правильный» номер телефона состоит из цифр 0-9, может содержать символы «тире» и «пробел» для разделения групп знаков, и круглые скобки () для отделения кода межгорода. Если решать поставленную задачу «в лоб», то есть писать код, основанный на посимвольной обработке введенной строки, то анализатор будет иметь весьма сложный алгоритм, трудночитаемый код, и, скорее всего, работать с ошибками. Элегантный выход из данной ситуации – использование для проверки строки регулярных выражений.
3.2. Регулярные выражения: что это такое?
Регулярные выражения (Regular Expressions), на жаргоне программистов называемые «регэкспы» или «регэксы» – технология поиска фрагментов текста, соответствующих заданному образцу. Образец (pattern), задающий правило поиска, иначе называется шаблоном или маской. Образец выглядит как строка, составленная по определенным правилам. Он может содержать обычные символы и метасимволы – символы, обозначающие другие символы или их последовательности. Общеизвестным примером метасимволов могут быть «*» и «?», используемые при поиске файлов в Windows. Символ «*» заменяет ноль или более произвольных символов, а «?» – один произвольный символ. Так, поиск файла по шаблону "text?.*" найдет файлы text1.doc, textf.txt, texts.html и другие аналогичные, но не найдет text.txt или text.xls. Это пример примитивных регулярных выражений. Те регулярные выражения, что используются в языках программирования, имеют значительно бόльшую сложность, и обладают значительно более широкими возможностями.
Обработка текста с помощью регулярного выражения выглядит примерно так: задается шаблон (например, “\d+”, означающий поиск цифры (метасимвол \d), которая может повторяться один или более раз (метасимвол +)), и произвольный текст (например, “Л.Н.Толстой родился 28 августа (9 сентября) 1828 в усадьбе Ясная Поляна Тульской губернии.”).
В результате обработки текста регулярным выражением будут найдены подстроки, соответствующие шаблону поиска (подчеркнуты):
Л.Н.Толстой родился 28 августа (9 сентября) 1828 в усадьбе Ясная Поляна Тульской губернии.
Далее с этими подстроками можно делать что угодно: сохранять, удалять, заменять на что-то, показывать пользователю.
Обычно регулярные выражения применяются для:
проверки, соответствует ли введенная пользователем строка, заданному шаблону (например, адрес e-mail, серия и номер паспорта, дата рождения);
поиска в тексте подстрок, соответствующих шаблону (в текстовых редакторах функция Find/Find next; выдирание из файлов TXT, XML, HTML полезной информации: ссылок, адресов, имен – для последующего сохранения; полнотекстовый поиск в текстовых документах);
замены подстрок, соответствующих шаблону, на другие подстроки (в текстовых редакторах функция Find & Replace; форматирование текстовых файлов: подстановка вместо тегов в нужные места пользовательских данных; удаление из текстов программ неиспользуемых определений и пр.).
Особенно эффективны регулярные выражения в программах, написанных на интерпретируемых (скриптовых) языках: JavaScript, PHP, VBScript, Perl, Ruby, Python и др. Из-за того, что код программы интерпретируется, разбор «вручную» текстовых строк выполняется слишком медленно. А регулярные выражения тут работают быстрее, потому что библиотеки, реализующие их, пишутся на высокопроизводительных компилируемых языках (С, С++, Assembler). Наибольшее развитие регулярные выражения получили в Perl, где их поддержка встроена непосредственно в интерпретатор. В других языках, как правило, используются внешние модули. Для С/С++ известны библиотеки PCRE (Perl Compatible Regular Expression), boost/Regex++, RegExpr. Последнюю мы будем изучать.
