- •Министерство образования и науки российской федерации
- •Обработка текстов с использованием регулярных выражений
- •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.5e+2).
Проверить на корректность формата введенное пользователем 16-ричное число. Символы должны быть нечувствительны к регистру. Если число начинается с буквы, перед ней обязательно должен стоять ноль (вместо «FF» пишется «0FF»).
Проверить на корректность формата введенный адрес e-mail.
Проверить на корректность введенный IP-адрес (от 0.0.0.0 до 255.255.255.255).
Пользователь вводит время в формате час:мин:сек. Используя только средства регулярных выражений, проверить корректность введенных данных (часы от 0 до 23, минуты и секунды от 0 до 59).
Разделить URL на составные части: протокол (например, http), имя сайта, путь к каталогу на сайте, имя файла. Вывести на экран по частям. Учтите, что некоторые части могут отсутствовать.
Пользователь вводит полный путь к файлу на диске. Разделить путь на составляющие: имя диска, путь к каталогу, имя и расширение файла; вывести по частям. Учтите, что некоторые части могут отсутствовать.
Проверить на корректность формата данные, вводимые пользователем: Фамилия, имя и отчество в одной строке разделенные пробелами; дата рождения в формате дд.мм.гггг; серия и номер паспорта РФ; номер сотового телефона; номер городского телефона, включая код межгорода.
Из произвольного HTML-файла вытащить все ссылки (тэги <a href=…> и <img>), вывести на экран без повторов.
Задан произвольный HTML файл. Пользователь вводит название любого HTML тэга (например, «а», или «h1»). Нужно вывести на экран номера строк, где эти теги встречаются, и сами строки (при возможности подсветив искомые теги).
Из произвольного файла HTML вытащить все e-mail адреса, встречающиеся в ссылках <a href=”mailto:адрес”>…</a> (для простоты будем считать, что e-mail адреса записываются по одному).
Из произвольного HTML-файла удалить незначащие пробельные символы (код HTML записывается в одну длинную строку).
Задана последовательность цифр (например “908120672390452076559205750102…”), которая интерпретируется как записанные подряд, без пробелов, 10-значные номера сотовых телефонов. С помощью регулярных выражений выделить номера телефонов, которые начинаются с 4-х введенных пользователем цифр.
Предыдущая задача упрощается: цифр три, и они заданы жёстко в программе.
Из текста программы на произвольном языке программирования удалить все комментарии.
Форматирование текста. Задан произвольный текстовый файл. Требуется отформатировать текст: удалить пробельные символы (пробелы, табуляцию) в начале и конце каждой строки.
Задан произвольный файл TXT. Из текста исключить повторяющиеся слова – результаты опечаток: если два одинаковых слова идут подряд, оставить одно из них. Учесть возможные отличия в регистре слов («…Для для…»), различное количество пропусков между словами (пробелов, табуляций, символов перевода строки).
Задан текстовый файл, где в тексте встречаются пути к файлам (в виде «ИмяДиска:\\ПутьКФайлу\ИмяФайла» или «ПутьКФайлу\ИмяФайла»). Требуется скопировать перечисленные файлы в текущий каталог.
Задан текстовый файл, в каждой строке которого записан полный путь к файлу (в формате «ИмяДиска:\\ПутьКФайлу\ИмяФайла» или «ПутьКФайлу\ИмяФайла»), пользователь задает путь к каталогу. Требуется создать командный BAT-файл, в каждой строке которого разместить команду перемещения исходного файла в требуемый каталог (команда MS-DOS MOVE – см. www.itt-essen.com ).
Преобразование текстового файла в формат HTML. Задается имя файла TXT и файла HTML. Требуется сформатировать текст с использованием тегов HTML: 1) каждый абзац заключить в теги <p>…</p>. Абзацы разделяются пустой строкой. Пробелы в начале и конце каждой строки удалять. 2) текст, отделенный двумя пустыми строками, считать за заголовок и заключать в теги <h2>..</h2>. 3)URL-ы превратить в ссылки, используя теги <a href=”…”>…</a>. 4) E-mail адреса превратить в ссылки, используя тег <a href=”mailto:…”>…</a>.
Поиск и замена. Задан произвольный текстовый файл; строка, которую нужно найти; и строка, на которую нужно ее заменить. Заменить (с учетом регистра) текст в файле.
Подстановка текста в шаблон. Имеется текстовый файл (шаблон), содержащий в тексте теги (=ИмяТэга=) – места, куда подставляются пользовательские данные. Например:
Уважаемый =NAME= =SURNAME=!
Извещаем, что за прошедший месяц на ваш счет № =NUMBER= начислено =AMOUNT= рублей.
И имеется текстовый файл с данными, которые следует подставить, например:
Name:Иван
Surname:Иванович
Number:12345
Amount:160,70
Name:Валентина
Surname:Дмитриевна
Number:30865
Amount:88,00
... и т.д.
Блоки данных разделяются пустой строкой.
Нужно сформировать новый текстовый файл, состоящий из нескольких страниц (код символа «разрыв страницы» – 12). На каждой странице помещается текст шаблона с подставленными вместо тэгов данными.
Облегченный вариант предыдущего задания: сам шаблон и данные для постановки задаются не в файлах, а в самой программе в виде константных текстовых строк. Подстановку нужно делать ровно 1 раз. Результат вывести на экран.
Из текста программы на произвольном языке программирования удалить определения всех не используемых констант.
Из текста программы на произвольном языке программирования удалить определения всех не используемых функций и процедур.
Из текста программы на произвольном языке программирования удалить определения всех не используемых классов.
Разбор данных в формате CSV (см. http://ru.wikipedia.org/wiki/CSV). Результаты поместить массив (вроде как для дальнейшей работы), и вывести на экран (для проверки).
И в заключение, приводим текст регулярного выражения на Perl, предназначенного для анализа e-mail адреса согласно стандарту Интернета RFC 822 (описание стандарта http://tools.ietf.org/html/rfc822)
(взято отсюда: http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html)
(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t] )+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?: \r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:( ?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0 31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\ ](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+ (?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?: (?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z |(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n) ?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\ r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n) ?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t] )*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])* )(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t] )+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*) *:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+ |\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r \n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?: \r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t ]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031 ]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\]( ?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(? :(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(? :\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(? :(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)? [ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]| \\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<> @,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|" (?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t] )*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\ ".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(? :[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[ \]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000- \031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|( ?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,; :\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([ ^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\" .\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\ ]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\ [\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\ r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\] |\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0 00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\ .|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@, ;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(? :[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])* (?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\". \[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[ ^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\] ]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*( ?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\ ".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:( ?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[ \["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t ])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t ])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(? :\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+| \Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?: [^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\ ]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n) ?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[" ()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n) ?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<> @,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@, ;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t] )*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\ ".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)? (?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\". \[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?: \r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[ "()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t]) *))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]) +|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\ .(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z |(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:( ?:\r\n)?[ \t])*))*)?;\s*) |
Еще один образчик регулярных выражений: программа на Perl, удаляющая из текста повторяющиеся слова (когда два одинаковых слова идут подряд) (взято из [1] с.55)
1 автор – программист Андрей Сорокин (г. Санкт-Петербург).
2 2 используются текущие языковые настройки операционной системы (кодовые страницы). В кодовой странице Win1251 буква «Ё» имеет код 168, и не входит в диапазон А–Я (коды 192–223). То же касается буквы «ё» (код 184), которая не входит в диапазон а–я (коды 224–255). Поэтому модификатор {?i} не работает с буквами «ёЁ».