11.1. Метасимволы регулярных выражений
В качестве метасимволов регулярных выражений всегда используются следующие символы:
- * - означает "ноль или более" повторений символа;
- ? - означает "ноль или одно" повторение символа.
Реже используются следующие метасимволы:
- [<символ1>-<символ2>] - означает, что на текущем месте строки могут быть символы в диапазоне от <символ1> до <символ2>. Например: [A-Z] - все латинские прописные буквы; [A-Za-z] - все латинские буквы;
- + - означает "один или более" повторений символов;
- (…) - группировка символов и метасимволов;
- | - логическое ИЛИ. Имеет тот же смысл, что и в РБНФ.
Это - основные метасимволы. Кроме того, в Си подобных языках используются метасимволы:
Примечание. Все
метасимволы представлены в кодировке 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].
выдает:
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
Рис.
11.1.
Диалоговое окно команды "Find…" Multi Edit
Назначение. Поиск подстроки в тексте, открытом в редакторе (как текстовый файл). Замена символов не производится.
Опции.
- Поиск назад ( Backward ) или вперед ( Forward );
- Поиск с использованием Литералов/Регулярных выражений:
- Поиск только всего слова (а не фрагмента);
- При поиске игнорируется регистр букв (флажок " Ignore Case ");
- Поиск сразу всех вхождений (они выделяются в редакторе цветом). (Необходимо установить флажок " All occurrences ");
- Выдать запрос на дальнейший поиск (флажок " Prompted to next find ");
- и другие, менее важные опции.
Запрос пишется в верхней строке редактирования, запускается выбором кнопки " OK " или нажатием клавиши " Enter ".
Примечание: при повторном вызове диалогового окна команды в нем открывается предыдущий шаблон поиска. Есть также возможность перехода к ранее введенным шаблонам.
Replace
Рис.
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 в операционных системах).