Регулярные выражения
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 - нулевой символ (конец строки):
- и т.д.
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 ", то система воспримет метасимволы как обычные символы.
Рассмотрим эти команды поподробнее.
Find
Назначение. Поиск подстроки в тексте, открытом в редакторе (как текстовый файл). Замена символов не производится.
Опции.
- Поиск назад ( Backward ) или вперед ( Forward );
- Поиск с использованием Литералов/Регулярных выражений:
- Поиск только всего слова (а не фрагмента);
- При поиске игнорируется регистр букв (флажок " Ignore Case ");
- Поиск сразу всех вхождений (они выделяются в редакторе цветом). (Необходимо установить флажок " All occurrences ");
- Выдать запрос на дальнейший поиск (флажок " Prompted to next find ");
- и другие, менее важные опции.
Запрос пишется в верхней строке редактирования, запускается выбором кнопки " OK " или нажатием клавиши " Enter ".
Replace
Назначение. Поиск подстроки в тексте, открытом в редакторе, и замена его на другой фрагмент.
Опции.
- Поиск назад ( Backward ) или вперед ( Forward );
- Поиск с использованием Литералов/Регулярных выражений:
- Поиск только всего слова (а не фрагмента);
- При поиске игнорируется регистр букв (флажок " Ignore Case ");
- Поиск и замена сразу всех вхождений (они выделяются в редакторе цветом. Необходимо установить флажок " All occurrences ");
- Выдать запрос на дальнейший поиск/замену (флажок " Prompted to next find ");
- и другие, менее важные опции.
Запрос пишется в верхней строке редактирования, заменяемый фрагмент - строкой ниже. Запускается замена выбором клавиши " OK " или нажатием клавиши " Enter ".
Примечание: в строке заменяемого фрагмента не используются метасимволы. Поэтому, если Вы задали следующий шаблон:
(?*)
- поиск значений в непустых скобках, и следующий фрагмент замены:
a(?*)b,
то команда заменит все выражения, найденные по шаблону, строкой " a(?*)b ". Это отличает реализацию команды замены в Multi Edit (и не только! Запрет на такие метасимволы есть и в Perl) от "правильной" реализации регулярных выражений в других программах (оболочках shell в операционных системах).