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

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

< Лекция 10 || Лекция 11: 12 || Лекция 12 >
Аннотация: В данной лекции Вы познакомитесь с основной операцией обработки текстовых строк: операцией поиска и замены текста по шаблону. Конечно, эта тема мало связана с алгоритмами "искусственного интеллекта", о чем говориться в последних лекциях. Но именно на регулярных выражениях будет в основном построены алгоритмы преобразования символьных данных, которые Вы самостоятельно можете написать и исправить.

11.1. Метасимволы регулярных выражений

В качестве метасимволов регулярных выражений всегда используются следующие символы:

  • * - означает "ноль или более" повторений символа;
  • ? - означает "ноль или одно" повторение символа.

Реже используются следующие метасимволы:

  • [<символ1>-<символ2>] - означает, что на текущем месте строки могут быть символы в диапазоне от <символ1> до <символ2>. Например: [A-Z] - все латинские прописные буквы; [A-Za-z] - все латинские буквы;
  • + - означает "один или более" повторений символов;
  • (…) - группировка символов и метасимволов;
  • | - логическое ИЛИ. Имеет тот же смысл, что и в РБНФ.

Это - основные метасимволы. Кроме того, в Си подобных языках используются метасимволы:

  • \n - символ "перевод строки";
  • \r - символ "возврат каретки";
    Примечание. В MS-DOS символ "\n" заменяется при выводе парой "\r\n".
  • \t - символ "горизонтальная табуляция" (вставка отступа в размере ~6 - 8 пробелов после текущего символа);
  • \v - символ "вертикальная табуляция";
  • \a - "звуковой сигнал";
  • \f - "новая страница";
  • \' - апостроф;
  • \" - двойная кавычка;
  • \\ - обратный слеш;
  • \xdd - байтовое значение в шестнадцатеричном представлении;
  • \x20 - обычный пробел;
  • \0 - нулевой символ (конец строки):
  • и т.д.
Примечание. Все метасимволы представлены в кодировке ASCII. Для других кодировок их значения нужно перекодировать.
Примечание. Для языка Perl существует и другие метасимволы, которые можно использовать как в тексте, так и в регулярных выражениях. См. [59] и таблицу 11.1.
Таблица 11.1. Метапоследовательности регулярных выражений Perl
Последовательность Описание Примеры
\nnn Представляет символ, восьмеричный код которого равен nnn
\xnn Представляет символ, шестнадцатеричный код которого равен nn
\cn Представляет управляющий символ, который генерируется при нажатии комбинации клавши Ctrl+n Фрагменту \cD соответствует Ctrl+D
\$ Символ $
\@ Символ @
\% Символ %
\a Звонок
\e Символ Esc (ASCII код 27)
\f Символ перевода страницы (ASCII код 12)
\n Символ новой строки (ASCII код 10)
\r Символ "возврат каретки" (ASCII код 13)
\t Символ горизонтальный табуляции (ASCII код 9)
\v Символ вертикальной табуляции (ASCII код 11)
\s Представляет класс пробельный символов
\S Представляет класс непробельных символов.
\d Класс цифровых символов (то же самое [0-9])
\D Класс нецифровых символов (то же самое [^0-9])
\w Класс буквенно-цифровых символов [a-zA-Z_0-9]
\W Класс небуквенно-цифровых символов.
\A Начало строки
\Z Конец строки
\b Границы слова (между классами \w и \W)
\B Обозначает не границы слов
\l Первый символ регулярного выражения преобразуется в нижний регистр.
\u Первый символ регулярного выражения преобразуется в верхний регистр.
\L …\E Означает, что все символы в регулярном выражении между \L и \E преобразуются в нижний регистр.
\U … \E Означает, что все символы в регулярном выражении между \L и \E преобразуются в верхний регистр.
\Q … \E Означает, что все метасимволы в регулярном выражении между \Q и \E экранируются при помощи метасимвола \ Фрагмент /\Q^*?+\E/ аналогичен /\^\*\&\+/
\G Обозначает точку, в которой закончился предыдущий поиск m//g.

11.2. Простые регулярные выражения

К "простейшим" регулярным выражениям можно отнести:

  • шаблоны файлов в OS Shell;
  • шаблоны в текстовых редакторах и процессорах;
  • шаблоны в скриптовых языках текстовых редакторов.

Рассмотрим их поподробнее.

11.2.1. Оболочка MS-DOS Command

В данной оболочке (иногда она называется command shell MD-DOS) используются следующие метасимволы: "*" и "?". При этом "*" означает любое, в том числе и нулевое, повторение допустимых символов, а "?" означает наличие одного из допустимых символов. Примеры шаблонов:

  • *.* - все файлы с любым расширением;
  • *.txt - все файлы с расширением .txt;
  • command.* - все файлы с именем "command" и любым расширением;
  • *.do? - все файлы, расширение которых начинается с "do";
  • *.??? - все файлы, имеющие трехбуквенное расширение;
  • *. - все файлы с "пустым" расширением;
  • com* - все файлы, начинающиеся с символов "com" (однако лучше использовать шаблон "com*.*");
  • *.?* - все файлы с непустым расширением;
  • и т.д.

Эти шаблоны можно использовать в операциях с файлами, например:

  • >ren *.HTM *.htm - переименовывает все файлы с расширением .HTM (верхний регистр) в те же файлы с расширением .htm (нижний регистр);
  • >pkzip -u archieve.zip *.doc *.txt - обновляет архив archieve.zip файлами с расширениями .doc и .txt.

Более подробно об оболочках MS-DOS и Windows смотри [82, 84, 85, 4, 33]

11.2.2. Оболочка Linux Bash shell

Эта оболочка содержит все метасимволы command shell с теми же значениями, но содержит также метасимволы: […] и \.

Квадратные скобки позволяют задать набор символов для поиска. Система будет искать в именах файлов любой из этих символов (см. [66]).

[Пример 01]

Пусть у нас в каталоге системы имеются файлы:

doc1, doc2, doc3, docA, docB, docC, document.

Тогда следующие команды выдадут вот такие результаты:

>ls
doc1 doc2 doc3 docA docB docC document

>ls doc?

doc1 doc2 doc3 docA docB docC

>ls doc[1A]

doc1 docA

>ls doc[1-3]

doc1 doc2 doc3

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

Использование метасимвола "\"

Метасимвол \ переопределяет значение следующего за ним символа или метасимвола. Например:

[Пример 02].

>ls answer\?

выдает:

answer?

11.2.3. Регулярные выражения Multi Edit

Реализация регулярных выражений в редакторе Multi Edit почти такое же, как и в bash shell Linux (кроме символа \). Регулярные выражения в редакторе Multi Edit используются при вызове следующих команд:

  • Find… (Поиск);
  • Replace… (Замена);
  • File Find… (Поиск в файлах);
  • File Replace… (Замена в файлах);

Для использования регулярных в этих командах необходимо в диалоговом окне этих команд установить переключатель в положение: " Regular Expression " (обычно он там и стоит). Если же Вы установите переключатель в положение " Literal ", то система воспримет метасимволы как обычные символы.

Примечание: в языке ME Script установка и сброс режима регулярных выражений обеспечивается глобальной переменной REG_EXP_STAT.

Рассмотрим эти команды поподробнее.

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

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

Назначение. Поиск подстроки в тексте, открытом в редакторе (как текстовый файл). Замена символов не производится.

Опции.

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

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

Примечание: при повторном вызове диалогового окна команды в нем открывается предыдущий шаблон поиска. Есть также возможность перехода к ранее введенным шаблонам.
Replace
Диалоговое окно команды "Replace…" Multi Edit

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

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

Опции.

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

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

Примечание: при повторном вызове диалогового окна команды в нем открывается предыдущий шаблон поиска. Есть также возможность перехода к ранее введенным шаблонам.

Примечание: в строке заменяемого фрагмента не используются метасимволы. Поэтому, если Вы задали следующий шаблон:

(?*)

- поиск значений в непустых скобках, и следующий фрагмент замены:

a(?*)b,

то команда заменит все выражения, найденные по шаблону, строкой " a(?*)b ". Это отличает реализацию команды замены в Multi Edit (и не только! Запрет на такие метасимволы есть и в Perl) от "правильной" реализации регулярных выражений в других программах (оболочках shell в операционных системах).

< Лекция 10 || Лекция 11: 12 || Лекция 12 >