Perl. Библиотека программиста
Поиск по шаблону
Вам надоело многократно использовать две разные команды для копирования и подстановки.
Требуется узнать, состоит ли строка только из алфавитных символов.
Требуется выделить из строки отдельные слова.
Требуется сделать ваше сложное регулярное выражение более понятным и упростить его изменение в будущем.
Требуется найти не первое, a N-e совпадение шаблона в строке. Допустим, вы хотите узнать, какое
слово предшествует третьему экземпляру слова fish:
One fish two fish red fish blue fish
Требуется использовать регулярные выражения для последовательности, состоящей из нескольких строк.
Специальные символы . (любой символ, кроме перевода строки), ^ (начало строки) и $ (конец строки),
кажется, не работают. Это может произойти при одновременном чтении нескольких записей или всего содержимого файла.
Требуется прочитать записи, разделение которых описывается некоторым шаблоном. Perl не позволяет
присвоить регулярное выражение переменной-разделителю входных записей.
Многие проблемы — в первую очередь связанные с синтаксическим анализом сложных файловых форматов, —
заметно упрощаются, если у вас имеются удобные средства для чтения записей, разделенных в соответствии с
определенным шаблоном.
Требуется извлечь все строки, расположенные в определенном интервале. Интервал может быть задан
двумя шаблонами (начальным и конечным) или номером первой и последней строки.
Часто встречающиеся примеры — чтение первых 10 строк файла (строки с 1 по 10) или основного текста
почтового сообщения (все, что следует после пустой строки).
Требуется преобразовать регистр в другом локальном контексте или заставить метасимвол \w совпадать
с символами национальных алфавитов.
Предположим, у вас имеется полгигабайта текста на немецком языке, для которого необходимо
составить предметный указатель. Вы хотите извлекать слова (с помощью \w+) и преобразовывать их в
нижний регистр (с помощью lс или \L). Однако обычные версии \w и lс не находят слова немецкого языка
и не изменяют регистр символов с диакритическими знаками.
Требуется выполнить неформальный поиск по шаблону.
Задача часто возникает в ситуации, когда пользовательский ввод может быть неточным или содержащим ошибки.
Требуется возобновить поиск с того места, где было найдено последнее совпадение.
Такая возможность пригодится при многократном извлечении фрагментов данных из строки.
Имеется шаблон с максимальным квантификатором —*,+,? или {}. Требуется перейти от максимального
поиска к минимальному.
Классический пример — наивная подстановка для удаления тегов из HTML-документа.
Хотя s#<TT>.*</TT>##gsi
выглядит соблазнительно, в действительности будет удален весь текст от первого открывающего до
последнего закрывающего тега ТТ. От строки "Even <TT>vi</TT> can edit <TT>troff</TT>
effectively."
остается лишь "Even effectively" — смысл полностью изменился!
Требуется найти в документе повторяющиеся слова.
Имеется готовая программа, которой в качестве аргумента или входных данных передается шаблон.
В нее невозможно включить дополнительную логику например, параметры для управления учетом регистра
при поиске, AND и NOT. Следовательно, вы должны написать один шаблон, который будет совпадать с
любым из двух разных шаблонов (OR), двумя шаблонами сразу (AND) или менят смысл поиска на противоположный (NOT).
Подобная задача часто возникает при получении данных из конфигурационных файлов, Web-форм или
аргументов командной строки. Пусть у вас имеет программа, в которой присутствует следующий фрагмент:
chomp($pattern = <CONFIG_FH>);
if ( $data =~ /$pattern/ ) {...}
Если вы отвечаете за содержимое CONFIG_FH, вам понадобятся средства для передачи программе поиска
логических условий через один-единственный шаблон.
Требуется построить шаблон для проверки адресов электронной почты.
Некоторые полезные регулярные выражения.
Нет комментариев.
Оставить комментарий:
|
|