Опубликован: 23.10.2009 | Доступ: свободный | Студентов: 2818 / 107 | Оценка: 4.28 / 4.22 | Длительность: 17:27:00
Специальности: Программист
Лекция 11:

Регулярные выражения

< Лекция 10 || Лекция 11: 12 || Лекция 12 >
File Find
Диалоговое окно команды "File Find…" Multi Edit

Рис. 11.3. Диалоговое окно команды "File Find…" Multi Edit

Назначение. Поиск подстроки в группе файлов.

Опции.

  • Поиск с использованием Литералов/Регулярных выражений:
  • Поиск только всего слова (а не фрагмента);
  • При поиске игнорируется регистр букв (флажок " Ignore Case ");
  • Выдать запрос на дальнейший поиск (флажок " Prompted to next find ");
  • Поиск файлов не только в заданном каталоге, но и во всех его подкаталогах (флажок " Include subtree ");
  • и другие, менее важные опции.

Запрос пишется в верхней строке. Ниже задается шаблон файлов для поиска, а еще ниже - начальная директория для поиска. Запускается команда после выбора кнопки " OK " или нажатия клавиши " Enter ".

File Replace
Диалоговое окно команды "File Replace…" Multi Edit

Рис. 11.4. Диалоговое окно команды "File Replace…" Multi Edit

Назначение. Поиск и замена подстроки на заданный фрагмент в группе файлов.

Опции.

  • Поиск с использованием Литералов/Регулярных выражений:
  • Поиск только всего слова (а не фрагмента);
  • При поиске игнорируется регистр букв (флажок " Ignore Case ");
  • Выдать запрос на дальнейший поиск/замену (флажок " Prompted to next find ");
  • Поиск файлов не только в заданном каталоге, но и во всех его подкаталогах (флажок " Include subtree ");
  • и другие, менее важные опции.

Запрос пишется в верхней строке ( Find ), за ней следует строка ( Replace ) для задания фрагмента для замены. Ниже задается шаблон файлов для поиска, а еще ниже - начальная директория для поиска. Запускается команда после выбора кнопки " OK " или нажатием на клавишу " Enter ".

Реализация команд в скрипте.

Команды " File Find… " и " File Replace… " в скриптовом языке не реализованы.

Команда " Find " реализована в скриптовом языке в виде двух функций: SEARCH_FWD для поиска вперед по файлу и SEARCH_BWD для поиска назад по файлу (к его началу). Обе функции имеют одинаковое число и смысл параметров. Их синтаксис:

SEARCH_???(<строка поиска>,<число строк>),
Листинг 11.1.

где <строка поиска> - фрагмент для поиска (может содержать шаблоны и регулярные выражения), а <число строк> указывает, сколько строк текста используется для поиска (целое число). Если <число строк> = 0, то поиск будет осуществляться до конца (начала) файла.

Любой найденный фрагмент можно заменить другим фрагментом функцией REPLACE с синтаксисом:

REPLACE(<строка замены>)
Листинг 11.2.

<строка замены> имеет те же свойства и требования, что и фрагмент замены в команде " Replace… " редактора.

Кроме того, при поиске и замене используются значения глобальных переменных: " REG_EXP_STAT " (допускающей регулярные выражения при поиске, если она установлена) и " IGNORE_CASE " (игнорирующая при поиске регистр латинских букв, если она установлена). Их необходимо устанавливать или сбрасывать до обращения к функциям SEARCH_FWD и SEARCH_BWD.

11.3. Регулярные выражения в Perl и Linux

Операционная система Linux не ограничивается реализацией регулярных выражений, приведенных в п. 11.2.2. Да, такие регулярные выражения полезны при файловых операциях в командной строке. Но как тогда быть с обработкой файлов конфигураций, так "полюбившимся" Linux? Тут требуются другие средства.

И такие средства были созданы! Это, прежде всего, потоковый фильтр sed и, конечно же, язык программирования Perl. Позже появились и Windows версии этих программ. Поскольку реализация в них операций поиска и замены строк с использованием регулярных выражений очень похожи, мы опишем их в едином блоке.

Поиск подстроки в строке на языке Perl осуществляется следующим образом:

[<исходная строка> =~ ]m/<образец>/<опции>
Листинг 11.3.

а замена - следующим образом:

[<исходная строка> =~ ]s/<образец>/[<замена>]/<опции>
Листинг 11.4.

где <исходная строка> - строка, в которой осуществляют поиск. Если она не указана, используется переменная $_ в Perl или очередная строка файла в sed. <образец> - подстрока (шаблон), который ищется в исходной строке (о нем пойдет речь ниже). <замена> - подстрока, которой заменяется данный образец. Если этот пункт опущен, то найденный образец удаляется из текущей строки. <опции> - определяют режимы поиска или замены. Наиболее важные из них:

  • i - игнорирование регистра латинских символов;
  • g - глобальная замена (заменяются все образцы, найденные в строке, а не только первый из них).

Более подробно об опциях команд см. [59] и таблицу 11.2.

Таблица 11.2. Флаги поиска m
Флаг Значение
i Поиск без учета регистра букв
m Строка трактуется как мультистрока, состоящая из нескольких строк, разделенных символом новой строки.
s Строка трактуется как одна строка, в этом случае метасимволу "." соответствует любой одиночный символ, включая символ новой сроки
x Разрешается использовать в образцах пробелы и комментарии. При использовании флага x пробелы в образцах игнорируются. Признаком комментария является символ "#". Пробелы позволяют сделать образец лучше читаемым.
g Задает глобальный поиск образца в заданной строке. Будут найдены все фрагменты образца, а не только первое вхождение. В контексте массива возвращает все найденные образцы. В скалярном контексте - 1 первый или последующий символ найден, "пустая строка" и возврат к началу строки, если послед. символы не найдены.
с Используется вместе с флагом g. Отменяет возврат в начало строки при неудачном поиске.
o Значения переменных, входящих в состав образца, подставляются только один раз, а не при каждом поиске по данному образцу.
Флаги замены s
Флаг Значение
i Поиск без учета регистра букв
m Строка трактуется как мультистрока, состоящая из нескольких строк, разделенных символом новой строки.
s Строка трактуется как одна строка, в этом случае метасимволу "." соответствует любой одиночный символ, включая символ новой сроки
x Разрешается использовать в образцах пробелы и комментарии. При использовании флага x пробелы в образцах игнорируются. Признаком комментария является символ "#". Пробелы позволяют сделать образец лучше читаемым.
g Задает глобальную замену всех фрагментов удовлетворяющих образцу, новым текстом.
e Указывает, что заменяющий текст - это Perl-выражение, которое вначале нужно вычислить.
o Значения переменных, входящих в состав образца, подставляются только один раз, а не при каждом поиске по данному образцу.

В образце можно использовать следующие метасимволы:

  • \s - все пробельные символы;
  • \d - аналогичен регулярному выражению: [0-9];
  • \w - аналогичен регулярному выражению: [0-9A-Za-z];
  • \A - начало строки;
  • \Z - конец строки;
  • \\ - бэкслеш;
  • . - обозначает любой одиночный символ, кроме символа новой строки. Так, образцу /.+/ соответствует любая непустая строка.
  • […] - пара квадратных скобок используется для представления любого одиночного символа из числа заключенных в скобки;
  • ^ - символ внутри квадратных скобок используется для представления любого одиночного символа не из числа заключенных в скобки;
  • $ - если этот знак расположен в конце выражения, то он указывает на конец строки;
  • ^ - если знак расположен в начале выражения, то он указывает на его начало. Например: /^$/ - пустая строка;
  • | - метасимвол-аналог оператора: "ИЛИ" в логическом выражении, означает альтернативу;
  • (…) - выражение в скобках, во-первых, задает приоритет операций выбора, а во-вторых, определяет переменные замены: $1, $2, … $nn. Так, переменной $1 присваивается найденное содержимое первой скобки (..), $2 - второй (…) и т.д.;
  • * - коэффициент, указывающий, что предыдущий символ повторяется от нуля до бесконечности;
  • + - коэффициент, указывающий, что предыдущий символ повторяется один или более число раз;
  • ? - коэффициент повторения 0 или 1 раз;
  • {n} - коэффициент ровно n повторений;
  • {n,m} - коэффициент повторения символа от n до m раз;
  • \xnn - символ с шестнадцатеричным значением nn;
  • \b - граница слова;
  • \G - обозначает точку, в которой закончился предыдущий поиск m//g;
  • и др.

В строке <замена> можно использовать все обычные символы, метасимволы \\, \xnn, а также все "маскирующие" знаки и переменные: $1, $2, … $nn. Например: s/^(\w+)\s(\w+)/$2\x20$1/ - меняет местами в начале строки два слова.

Примеры регулярных выражений:

  • /.*/ - любая строка;
  • /.+/ - любая непустая строка;
  • /^$/ - пустая строка;
  • /^(\w+)\s(\w+)$/ - строка из двух слов;
  • /^Perl./ - строка, начинающаяся с Perl;
  • /.Perl$/ - строка, заканчивающаяся Perl;
  • /(\w+)\s?=\s?(\w+)\s*$/ - элемент (ключ = значение) файла конфигурации Linux;
  • /\[(\w+)\]\s*\$/ - элемент [Раздел] файла конфигурации Linux;
  • /\w{1,6}/ - идентификатор максимум из 6 символов.

11.4. Примеры регулярных выражений

В архивах, расположенных на [http://yudenisov.narod.ru/SOURCECODE/] моем сайте, приведены примеры регулярных выражений, превращающих текстовый файл в HTML-документ по определенным шаблонам. Примеры написаны на языках Си, Perl, Multi Edit Script, распространяются по лицензии GNU GPL. Также на них есть документация, распространяемая на условиях Copyleft.

11.5. Резюме

В данной лекции Вы познакомились с основными правилами записи и применения регулярных выражений. Вы узнали, что такое "символ", "модификатор", а также работу с регулярными выражениями в оболочках операционных систем, текстовых редакторах и "скриптовых" языках программирования.

После прочтения этой лекции Вы можете не только читать, но и писать свои собственные программы с использованием регулярных выражений. Изучите эту лекцию и глоссарий к ней, чтобы потом у Вас не было пробелов знаний при использовании регулярных выражений.

11.6. Глоссарий

Термин (рус.) Термин (англ.) Толкование
регулярные выражения regular expressions Символьная строка, содержащая, кроме символов в любой из кодировок, специальные метасимволы, шаблоны поиска, и другие специально обрабатываемые символы. Регулярные выражения используются в операциях поиска и замены текстовых строк.
шаблон поиска template of search Регулярное выражение, предназначенное для поиска строк, файлов и т.п., в котором используются метасимволы "?", "*" и "[…]". При поиске с помощью шаблонов можно очень точно определить критерии поиска, чтобы можно было найти, например, не один, а сразу несколько файлов, провести замену символов сразу в нескольких фрагментах строк и т.д.
метасимволы (регулярных выражений) meta symbol (of regular expressions) Символы в регулярных выражениях, имеющие в них специальное значение. Метасимволами обозначаются начало и конец строк, присутствие символа определенного вида, диапазон символов и т.д. С помощью модификаторов можно указать "повторяемость" символов из данного шаблона. Правила записи метасимволов определяются синтаксисом регулярных выражений.
модификатор (в регулярных выражениях) modifier (of regular expressions) Специальный знак, стоящий после "простого" символа, метасимвола или группы символов и указывающий, сколько раз может повторяться данная конструкция. В языке Perl модификаторами являются символы: "?", "*", "+" и "{…}". В некоторых языках (например, в языках командных оболочек DOS и UNIX) модификаторы используются вместо метасимволов.
команда 'ren' ren command Команда для переименования файлов в MS-DOS и WINDOWS. При переименовании эта команда может использовать регулярные выражения, допустимые в командных оболочках этих операционных систем.
меню 'Find…' 'Find…' menu Подменю во всплывающем меню ("Edit", "Search" и т.д.) предназначенное для поиска слов или фрагмента слов в текстовом файле, открытом в текстовом редакторе. При поиске можно задавать шаблоны поиска.
меню 'Replace…' 'Replace…' menu Подменю во всплывающем меню ("Edit", "Search" и т.д.) предназначенное для поиска слов или фрагмента слов в текстовом файле, открытом в текстовом редакторе, и заменой его на другой фрагмент. При поиске можно задавать шаблоны поиска, но в строке замены регулярных выражений быть не должно!
меню 'File Find…' 'File Find…' menu Подменю во всплывающем меню "Search" редактора Multi-Edit, предназначенное для поиска слов или фрагмента слов в нескольких текстовых файлах, выбранных по заданному регулярному выражению. При поиске можно задавать шаблоны поиска.
меню 'File Replace…' 'File Replace…' menu Подменю во всплывающем меню "Search" редактора Multi-Edit, предназначенное для поиска слов или фрагмента слов в нескольких текстовых файлах, выбранных по заданному регулярному выражению, и заменой его на другой фрагмент. При поиске можно задавать шаблоны поиска, но в строке замены регулярных выражений быть не должно!
литерал 2 literal 2 Символьная строка "как есть", записанная особым образом (обычно ограниченная одинарными кавычками). В литералах не производится выделение метасимволов.
поиск слова search of word Поиск слова целиком, как оно написано в тексте, с использованием литералов или регулярных выражений.
поиск фрагмента search of fragment Поиск всего слова или только его части (фрагмента) в тексте, с использованием литералов или регулярных выражений.
игнорирование регистра (при поиске) ignore of case (in a search) Если включена данная опция, при поиске текста ЭВМ не различает строчные или прописные символы в тексте (то есть игнорирует регистр букв). В большинстве редакторов текста игнорирование регистра происходит по-умолчанию.
замена с запросом replace with prompt Если включен данный режим, то при замене текста "всплывает" сообщение, запрашивающее, надо ли применять данную замену для найденного слова или фрагмента. Если же этот режим выключен, замена производится без запроса сразу для всех удовлетворяющих критериям поиска слов.
предыдущий шаблон поиска previous template of search Предыдущий шаблон поиска, сохраненный в реестре Windows или файлах конфигурации UNIX. C помощью специального меню его можно использовать повторно при операциях поиска и замены.
начальный каталог (для поиска) starting directory (of the search) Папка, из которой "рекурсивно" просматриваются все файлы в операциях файлового поиска и замены слов.
потоковый фильтр sed stream filter 'sed' Программа-фильтр в операционных системах UNIX и Linux, предназначенная для автоматического построчного "редактирования" текстовых файлов, поиска и замены в них строк, добавления строк с текстом и другие операции. С помощью проекта "GNUWin32" этот фильтр стал доступен и в операционных системах Windows.
< Лекция 10 || Лекция 11: 12 || Лекция 12 >