Программирование для гуманитариев

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

Разбить на страницы
Показывать лекцию целиком

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.
    Метапоследовательности регулярных выражений 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

    (рис 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 в операционных системах).

    File Find

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

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

    Опции.

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

    File Replace

    (рис 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_???(<строка поиска>,<число строк>),

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

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

    REPLACE(<строка замены>)

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

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

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

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

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

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

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

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

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

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

  • i - игнорирование регистра латинских символов;
  • g - глобальная замена (заменяются все образцы, найденные в строке, а не только первый из них).
  • Более подробно об опциях команд см. [59] и таблицу 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.
    Страницы:

    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.
    Метапоследовательности регулярных выражений 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

    (рис 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 в операционных системах).

    File Find

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

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

    Опции.

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

    File Replace

    (рис 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_???(<строка поиска>,<число строк>),

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

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

    REPLACE(<строка замены>)

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

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

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

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

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

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

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

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

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

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

  • i - игнорирование регистра латинских символов;
  • g - глобальная замена (заменяются все образцы, найденные в строке, а не только первый из них).
  • Более подробно об опциях команд см. [59] и таблицу 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.
    Вернуться к учебному плану