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

Основные технологии создания и использования регулярных выражений на UNIX-системах

Вы можете создавать и тестировать регулярные выражения (regexps) в UNIX-системах различными способами. Исследуйте доступные инструментальные средства и приемы, которые помогут вам узнать, как создавать регулярные выражения для различных программ и языков.

Михаэль Штутц, писатель, консультант

Михаэль Штутц (Michael Stutz) - автор книги The Linux Cookbook, которую он создал и набрал на компьютере с использованием только программного обеспечения с открытым исходным кодом. Его интересы в работе включают также цифровую публикацию и будущее его книги. Он использует различные версии операционной системы UNIX вот уже 20 лет. Вы можете написать ему на адрес stutz@dsl.org.



06.11.2007

Концепция регулярных выражений (regexps) - обозначений для описания шаблонов, соответствующих набору строк - является общей для множества программ и языков программирования. Различные реализации регулярных выражений отличаются друг от друга в деталях, но принципы, необходимые для обучения созданию регулярных выражений, одинаковы во всех их реализациях.

Эта статья рассматривает несколько полезных инструментальных средств и приемов для обучения созданию и улучшению регулярных выражений для ряда приложений UNIX®, таких как:

Маркировка совпадений в зависимости от их контекста

При создании регулярного выражения нелишней будет возможность видеть, какие строки сопоставляются с образцом в текущем наборе данных. Рассмотрите этот текст, состоящий из четырех строк в примере 1 и простейшее регулярное выражение t[a-z] которое находит соответствие для двухсимвольного шаблона.

Пример 1. Текст из четырех строк и регулярное выражение, которое ищет в них совпадения
        $ cat midsummer
        I know a bank where the wild thyme blows,
        Where oxlips and the nodding violet grows,
        Quite over-canopied with luscious woodbine,
        With sweet musk-roses and with eglantine.
        $ grep t[a-z] midsummer
        I know a bank where the wild thyme blows,
        Where oxlips and the nodding violet grows,
        Quite over-canopied with luscious woodbine,
        With sweet musk-roses and with eglantine.
        $

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

Для такого простого регулярного выражения как это, вы можете и сами уверенно сразу ответить на этот вопрос. Но когда создано запутанное регулярное выражение и оно работает с большими наборами данных или входными файлами, будет гораздо труднее труднее понять, какая строка или строки будут поставлены в соответствие с регулярным выражением. Очень полезно иметь возможность видеть для каждой строки какой именно текст в ней совпал с образцом в регулярном выражении. Способ увидеть результат работы регулярных выражений - промаркировать их, когда они будут возвращать результаты.

Вы можете осуществить это с помощью нескольких приложений, включая grep, sed и Emacs.

Маркирование при помощи grep

Некоторые из новейших версий grep (такие как GNU grep) отмечают цветом регулярное выражение, когда вы используете опцию --color, как показано на рисунке 1.

Рисунок 1. Выделенные цветом совпавшие подстроки в grep
Выделенные цветом совпавшие подстроки в grep

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

Маркирование при помощи sed

Вы также можете маркировать регулярное выражение при помощи потокового редактора sed. Команда sed :

        's/regexp/[&]/g'

Она заключает в квадратные скобки все совпадения с образцом, отмеченные регулярным выражением. Пример 2 показывает результаты работы sed на несложном тексте.

Пример 2. Совпадения строк, отмеченные sed
        $ sed 's/t[a-z]/[&]/g' midsummer
        I know a bank where [th]e wild [th]yme blows,
        Where oxlips and [th]e nodding violet grows,
        Qui[te] over-canopied wi[th] luscious woodbine,
        Wi[th] sweet musk-roses and wi[th] eglan[ti]ne.
        $

Естественно, что вы можете выделить результаты работы регулярного выражения и другим путем. Если вводимые данные являются документом традиционной машинописной системы Groff, также можно добавить поддержку жирного шрифта к регулярному выражению и передать документ команде groff на выполнение:

        $ sed 's/t[a-z]/\\fB&\\fP/g' infile.roff | groff -

Также можно написать короткую sed-программу, чтобы отметить удачные сопоставления цветом. Если ваша оболочка поддерживает управляющие последовательности, вы можете отметить цветом все регулярные выражения в контексте файла. Ввиду того, что управляющие последовательности являются громоздкими для ручного ввода, вы несомненно захотите запустить их при помощи скрипта, как показано в примере 3.

Пример 3. sed-программа, которая выделяет цветом совпавшие с образцом строки
        #!/bin/sh
        # highlights regexp pattern in input file
        # usage: hre regexp file
        sed 's/'$1'/^[[34m&^[[37m/g' < $2

Символ ^[, который дважды появляется в примере, является символом управляющей последовательности, поэтому вам надо вводить этот пример в редакторе, который поддерживает ввод литеральных символов - например Emacs (где для ввода символа управляющей последовательности вам надо ввести C-q ESC). Числа 34 и 37 являются кодами интерпретатора Bash для задания голубого и и белого цветов.

Чтобы сделать скрипт выполняемым, напечатайте:

        $ chmod 744 hre

Потом запустите его, как показано на рисунке 2.

Рисунок 2. Совпавшие подстроки выделены цветом при помощи sed
Совпавшие подстроки выделены цветом при помощи sed

Хотя вы можете определить цвет выделения (маркирования) текста и простые цвета с помощью этого метода, существуют предостережения к его использованию. Например, скрипт, показанный в примере 3, работает только тогда, когда простой текст в окне терминала белого цвета, потому что он восстанавливает этот цвет текста. Если ваш терминал использует другой цвет для отображения простого текста, поменяйте в скрипте управляющий код. (Например, 30 - это черный.)

Выделение цветом с помощью Emacs

В новейших версиях редактора Emacs функции isearch-forward-regexp и isearch-backward-regexp выделяют все совпадения в буфере. Если у вас стоит последняя версия Emacs, попробуйте выполнить эти функции сейчас:

  1. Запустите Emacs, напечатав:
                $ emacs midsummer
  2. Введите следующее: M-x isearch-forward-regexp.

    Последовательность M-x - это условный знак Emacs для Meta-x, который вы можете ввести в большинстве систем либо нажав и удерживая клавиши Alt, одновременно нажав X, а затем отпустив обе клавиши, либо нажав клавишу Esc, отпустив ее, и затем нажав клавишу X.

  3. Создайте регулярное выражение типа: t[a-z]

    Ввиду того, что поиск инкрементый, Emacs начинает маркировать совпадения как только вы напечатаете единственный символ: в этом случае, когда при нажатии клавиши T, все символы T в буфере выделяются. Заметьте, что как только вы начинаете печатать что-либо, заключая содержимое в скобки, маркирование исчезнет и Emacs выведет отчет в средство minibuffer о том, что у него недостаточно входных данных для отобрженияя удачных сопоставлений.

    Результаты вашей работы с Emacs должны выглядеть примерно так, как на рисунке 3.

    Рисунок 3. Буфер Emacs показывает регулярное выражение для текущей задачи
    Буфер Emacs показывает регулярное выражение для текущей задачи
  4. Введите C-x C-c чтобы выйти из Emacs.

    Вы вводите эту комбинацию путем нажатия и удерживания клавиши Ctrl и однократного нажатия X, повторного нажатия и удерживания Ctrl с одновременным нажатием клавиши C.

Функциям isearch-forward-regexp и isearch-backward-regexp обычно соотвествуют комбинации M-S-s и M-S-r. (Чтобы создать их, нажмите и удерживайте клавишу Alt, Ctrl и либо клавишу S либо клавишу R.)

Отображение только совпадений, а не строк целиком

Есть другой подход к проблеме контекста образца, который состоит только в том, чтобы выводить только совпадения сами по себе, а не строки, где было найдено это совпадение, целиком. Существует несколько способов чтобы сделать это с помощью grep, sed, и perl.

Отображение только совпадений при помощи grep

Флаг --only-matching (или по-другому -o) изменяет поведение grep так, что команда выводит не целиком строки, в которых нашлись совпадения с шаблоном регулярного выражения, а только сами совпадения. Вместе с флагом --color, описанным выше, эта возможность появилась в новейших реализациях некоторых версий grep, включая GNU grep, у которого открытый исходный код и который доступен для многих операционных систем.

Итак, этот флаг предназначен для сбора данных, которые удовлетворяют условию в регулярном выражении, поэтому он идеально подходит для сбора IP-адресов, URL-ссылок, имен, адресов электронной почты, и т.п., но помимо всего прочего это еще и отличный способ получить регулярные выражения. Например, пример 4 показывает как использовать этот флаг, чтобы получить все слова из исследуемого текста из примера 1. Он выводит каждое слово в отдельную строку.

Пример 4. Сбор всех слов из текста
        $ egrep -o '[A-Za-z]+' midsummer
        I
        know
        a
        bank
        where
        the
        wild
        thyme
        blows
        Where
        oxlips
        and
        the
        nodding
        violet
        grows
        Quite
        over
        canopied
        with
        luscious
        woodbine
        With
        sweet
        musk
        roses
        and
        with
        eglantine
        $

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

Допустим, нужно вывести все слова из текстового файла, содержащие строку th, и вы создали регулярное выражение для реализации этого, как показано в примере 5.

Пример 5. Вывод всех слов, содержащих th. Первая попытка
        $ egrep -o 'th[a-z]*' midsummer
        the
        thyme
        the
        th
        th
        th
        $

Регулярное выражение не работает. Видно, что некоторые из результатов, выведенных регулярным выражением, вообще не являются словами. Лучше попробуйте заново: пример 6 учитывает также любые символы в словах, которые могут предшествовать th.

Пример 6. Выводим все слова с th. Вторая попытка
        $ egrep -o '[a-z]*th[a-z]*' midsummer
        the
        thyme
        the
        with
        ith
        with
        $

Уже гораздо лучше, но пока еще не идеальный результат. Строчка th говорит о том, что регулярное выражение не воспринимает верхний регистр, когда ищет совпадения со своим образцом. Исправьте это при помощи флага -i, как показано в примере 7.

Пример 7. Вывод всех слов, содержащих th. Третья попытка
        $ egrep -o -i '[a-z]*th[a-z]*' midsummer
        the
        thyme
        the
        with
        With
        with

Теперь то, что надо!

Использование флага -o и каких-нибудь тестовых данных для проверки регулярного выражения очень полезно при их создании, так как можно предположить что регулярное выражение работает должным образом, но в то же время и не знать, что есть случаи, которые оно не охватывает и не может корректно провести сопоставление.

Отображение только совпадений с использованием sed

Вы можете делать вещи, как в прошлом пункте, уже с использованием команды sed:

        s/.*\(regexp\).*/\1/p

Эта команда выводит только совпавшие с образцом символы из вводимых данных, а не строки, которые содержат совпадения, целиком, но отображается последнее совпадение в строке, как показано в примере 8.

Пример 8. Вывод только совпавших символов при помощи sed
        $ sed -n 's/.*\(th[a-z]\).*/\1/p' midsummer
        thy
        the
        $ grep -o th[a-z] midsummer
        the
        thy
        the
        $

Отображение только совпадений с Perl

Регулярные выражения также активно используются в языке программирования Perl, но регулярные выражения в Perl отличны от тех, что вы строили при помощи команды grep. Инструментальное средство pcretest позволяет протестировать регулярные выражения в Perl. Можно использовать этот инструментарий, чтобы ознакомится с Perl-совместимой библиотекой регулярных выражений (PCRE), и для того, чтобы отладить или протестировать регулярные выражения, которые были созданы с помощью этого инструментального средства.

Обычно регулярное выражение заключается в символы-слэши (/) и сопровождается модификаторами, которые вносят изменения в механизм поиска. Наиболее распространенные модификаторы регулярных выражений представлены в таблице 1.

Таблица 1. Распространненые модификаторы регулярных выражений для инструментального средства pcretest
МодификаторОписание
8Этот модификатор добавляет поддержку символов Unicode (UTF-8).
g Этот модификатор ищет глобальные совпадения (больше чем по одному на строку).
iЭтот модификатор позволяет игнорировать регистр символов.
mЭтот модификатор дает возможность поиска на нескольких строках.
xЭтот модификатор использует расширенные регулярные выражения Perl.

Попробуйте запустить pcretest, как показано на рисунке 9.

Рисунок 9. Тестирование ваших регулярных выражений при помощи pcretest
        $ pcretest
        PCRE version 6.7 04-Jul-2006

        re> /[a-z]*th[a-z]*/ig
        data> With sweet musk-roses and with eglantine.
        0: With
        0: with
        data> Ctrl-c
        $

Также можно запустить pcretest с входным файлом, который содержит регулярное выражение, которое надо протестировать на одной только строке или совокупности строк. У вас могут быть составные регулярные выражения и образцы для сравнивания, тогда они должны быть отделены друг от друга пустой строкой. pcretest продолжает искать совпадения для образца регулярного выражения во входных данных до тех пор, пока он не достигнет конца файла (EOF).

Если вы предоставите pcretest имя второго файла, то он будет выводить результаты в него. В противном случае он осуществляет стандартный вывод, как показано в примере 10.

Пример 10. Запуск pcretest с входным файлом
        $ cat midsummer.pre
        /w[hi]|th/gi
        I know a bank where the wild thyme blows,
        Where oxlips and the nodding violet grows,
        Quite over-canopied with luscious woodbine,
        With sweet musk-roses and with eglantine.
        $ pcretest midsummer.pre
        PCRE version 6.7 04-Jul-2006

        /w[hi]|th/gi
        I know a bank where the wild thyme blows,
        0: wh
        0: th
        0: wi
        0: th
        Where oxlips and the nodding violet grows,
        0: Wh
        0: th
        Quite over-canopied with luscious woodbine,
        0: wi
        0: th
        With sweet musk-roses and with eglantine.
        0: Wi
        0: th
        0: wi
        0: th
        $

Использование мастера создания регулярных выражений

txt2regex является интерактивным кросс-платформенным мастером для создания регулярных выражений для интерпретатора Bash. Когда вы его запускаете, он задает ряд вопросов об образце, с которым нужно искать совпадения и затем создает корректное регулярное выражение для любого из двух дюжен различных приложений:

  • awk;
  • ed;
  • egrep;
  • emacs;
  • expect;
  • find;
  • gawk;
  • grep;
  • javascript;
  • lex;
  • lisp;
  • mawk;
  • mysql;
  • ooo;
  • perl;
  • php;
  • postgres;
  • procmail;
  • python;
  • sed;
  • tcl;
  • vbscript;
  • vi;
  • vim.

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

Создание регулярного выражения

Чтобы создать регулярное выражение для одного или более поддерживаемых txt2regex приложений, разделяйте имена этих приложений запятой. И используйте этот список в качестве аргумента к флагу --prog.

Начните с попытки создания регулярного выражения как в разделе Выделенные цветом совпадения, которое ищет совпадения для символа Т, прямо за которым следует буква в нижнем регистре:

  1. Запустите txt2regex и определите регулярные выражения для grep, sed, и Emacs:
    $ txt2regex --prog grep,sed,emacs
  2. Вы хотите искать совпадения для буквы Т в любой части строки, а не только в ее начале, поэтому введите 2 для выбора условия "в любой части строки".
  3. Введите 2 снова для выбора опции "конкретный символ" и затем введите t, когда будут запрошено, для какого именно символа искать совпадения.

    Теперь вам следует ответить на вопрос сколько совпадений вам надо найти.

  4. Введите 1, чтобы точно определить максимум совпадений, которые надо найти.
  5. Для сопоставления букв нижнего регистра, введите 6 чтобы выбрать "особую комбинацию символов" и затем введите b для сопоставления букв нижнего регистра. Введите . для выхода в главное меню txt2regex.
  6. Для сопоставления букв нижнего регистра только один раз введите 1.

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

Рисунок 4. Создание регулярного выражения при помощи txt2regex
Создание регулярного выражения при помощи txt2regex

Введите .. для выхода. Список регулярных выражений останется на вашем терминале.

Да, вышло так, что все три регулярных выражения одинаковы t[a-z], но это только потому, что у нас достаточно простое регулярное выражение и три выбранных приложения имеют единый синтаксис для регулярных выражений. И далеко не всегда регулярные выражения будут одинаковы для всех трех выбранных приложений.

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

  1. Запустите txt2regex без каких-либо флагов:
    $ txt2regex
  2. Введите 2 для поиска совпадений в любой части строки.
  3. Введите 6 чтобы задать специальную комбинацию и затем введите a и b для выбора всех букв вернего или нижнего регистра.
  4. Введите . для возвращения в главное меню а затем введите 4 чтобы определить, что нужно искать одно или более совпадений.

Без флагов, то есть по умолчанию, txt2regex создаст регулярные выражения для следующих приложений и языков: perl, php, postgres, python, sed, and vim. Когда вы пройдете все этапы, описанные выше, при создании регулярного выражения, обнаружится, что первые четыре приложения используют теже регулярные выражения, что были использованы с grep в примере 4, но регулярные выражения для sed и vim отличаются друг от друга незначительно. Это потому, что эти приложения используют несколько разные наборы метасимволов, как будет описано ниже.

И снова введите .. для выхода из программы; регулярные выражения для различных программ останутся на вашем терминале. Вы можете использовать их такими или улучшать их дальше. Например, как насчет поиска совпадений для слов, содержащих символ апострофа (') &#151;don't, who're, e'er, owner's, 'cause, Joe's и тому подобных? Регулярное выражение, которое вы создали только что, не сможет корректно сопоставлять такие слова (см. пример 11).

Пример 11. Неправильное сопоставление слов с апострофом
          $ echo "Don't miss a word, just 'cause it's wrong." | egrep [A-Za-z]+
          Don
          t
          miss
          a
          word
          just
          cause
          it
          s
          wrong
          $

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

Пример 12. Правильное сопоставление слов с апострофом
          $ echo "Don't miss a word, just 'cause it's wrong." | egrep "[A-Za-z']+"
          Don't
          miss
          a
          word
          just
          'cause
          it's
          wrong
          $

Следующее регулярное выражение, котороерассматривалось в разделе Как показать только сами совпадения, а не строку целиком было для одиночных слов, содержащих в любой своей части сочетание символов th. Вы использовали регулярные выражения для egrep, sed, и perl; теперь попробуем создать его для grep:

  1. Запустите txt2regex:
                  $ txt2regex
  2. Введите / для выбора доступных программ и введите hkopqstx.. Таким образом будет создано регулярное выражение только для grep.
  3. Введите 26ab.3 для возможности поиска нужного сочетания букв верхнего или нижнего регистра где угодно в строке.
  4. Введите 2t12h1 для задания символов, которым искать совпадения - T и H, следующими друг за другом, причем это сочетание, TH, встречается только один раз в слове.
  5. Введите 6ab.3 для возможности поиска последовательности букв th; любого регистра.
  6. Введите ..для выхода из программы.

Вы можете протестировать построенное регулярное выражение, как показано в примере 13.

Пример 13. Сопоставление слов, содержащих th при помощи grep
          $ grep -o [A-Za-z]*th[A-Za-z]* midsummer
          the
          thyme
          the
          with
          With
          with
          $

Краткие сведения об опциях регулярных выражений

Опция (флаг) --showinfo выводит краткую сводку информации о создании регулярных выражений конкретно для какого-либо языка или программы. В выводимую информацию включается название и версия приложения, метасимволы регулярного выражения, символ по умолчанию отмеченного подвыражения ("\"), которое может быть использовано позже, метасимволы, перед которыми надо ставить "\", можете ли вы использовать в квадратных скобках символ табуляции ("\t") и поддерживает ли язык или приложение выражения, заключаемые в квадратные скобки, определенные в Portable Operating System Interface (POSIX).

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

Пример 14. Получения краткого обзора правил регулярных выражений при помощи txt2regex
          $ txt2regex --showinfo javascript

          program  javascript: netscape-4.77
          metas  . [] [^] * + ? {} | ()
          esc meta  \
          need esc  \.*[{(|+?^$
          \t in []  YES
          [:POSIX:]  NO

          $ txt2regex --showinfo php

          program  php: 4.0.6
          metas  . [] [^] * + ? {} | ()
          esc meta  \
          need esc  \.*[{(|+?^$
          \t in []  YES
          [:POSIX:]  YES

          $

Получение готовых регулярных выражений

Опция --make описана своим автором как a remedy for headaches (лекарство от головной боли). Оно выводит регулярные выражения для одного из нескольких общих образцов, которые задаются как параметры. Список готовых регулярных выражений показан в таблице 2.

Таблица 2. Список готовых регулярных выражений, предоставляемых txt2regex
АргументОписание
date Этот параметр соответствует дате в формате mm/dd/yyyy с диапазоном от 00/00/0000 до 99/99/9999.
date2 Этот параметр соответствует дате в формате mm/dd/yyyy с диапазоном от 00/00/1000 до 19/39/2999.
date3 Этот параметр соответствует дате в формате mm/dd/yyyy с диапазоном от 00/00/1000 до 12/31/2999.
hour Этот параметр соответствует времени в формате hh:mm в диапазоне от 00:00 до 99:99.
hour2 Этот параметр соответствует времени в формате hh:mm в диапазоне от 00:00 до 29:59.
hour3 Этот параметр соответствует времени в формате hh:mm в диапазоне от 00:00 до 23:59.
numberЭтот парамеир соответствует любому положительному или отрицательному целочисленному значению.
number2Этот параметр соотвествует любому положительному или отрицательному целому числу с дополнительными разрядами после запятой.
number3Этот параметр соответствует положительному или отрицательному целому числу с дополнительными запятыми и дополнительным значением после запятой.

Например, вы можете использовать эти параметры чтобы получить готовое регулярное выражение для работы с военным временем, как показано в примере 15.

Пример 15. Получение регулярного выражения для работы со временем от txt2regex
          $ txt2regex --make hour3

          RegEx perl    : ([01][0-9]|2[0123]):[012345][0-9]
          RegEx php     : ([01][0-9]|2[0123]):[012345][0-9]
          RegEx postgres: ([01][0-9]|2[0123]):[012345][0-9]
          RegEx python  : ([01][0-9]|2[0123]):[012345][0-9]
          RegEx sed     : \([01][0-9]\|2[0123]\):[012345][0-9]
          RegEx vim     : \([01][0-9]\|2[0123]\):[012345][0-9]

          $

Список метасимволов

Другой полезной возможностью txt2regex является опция --showmeta, которая выводит таблицу, содержащую все метасимволы, используемые при построении регулярных выражений для поддерживаемых приложений и языков. Работа этой опции показана в примере 16.

Пример 16. Отображение всех метасимволов при помощи txt2regex
          $ txt2regex --showmeta

          awk       +       ?               |      ()
          ed      \+      \?    \{\}      \|    \(\)
          egrep       +       ?      {}       |      ()
          emacs       +       ?              \|    \(\)
          expect       +       ?               |      ()
          find       +       ?              \|    \(\)
          gawk       +       ?      {}       |      ()
          grep      \+      \?    \{\}      \|    \(\)
          javascript       +       ?      {}       |      ()
          lex       +       ?      {}       |      ()
          lisp       +       ?             \\|  \\(\\)
          mawk       +       ?               |      ()
          mysql       +       ?      {}       |      ()
          ooo       +       ?      {}       |      ()
          perl       +       ?      {}       |      ()
          php       +       ?      {}       |      ()
          postgres       +       ?      {}       |      ()
          procmail       +       ?               |      ()
          python       +       ?      {}       |      ()
          sed      \+      \?    \{\}      \|    \(\)
          tcl       +       ?               |      ()
          vbscript       +       ?      {}       |      ()
          vi   \{1\}  \{01\}    \{\}            \(\)
          vim      \+      \=     \{}      \|    \(\)

          NOTE: . [] [^] and * are the same on all programs.

          $

Изучение документов

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

Например, синтаксис создания регулярных выражений к grep, sed и других инструментальных средств подобного типа, а также примеры к этим регулярным выражениям описаны в справоной системе man. Если у вас установлены GNU-версии этих приложений, то у них также должны быть справочные системы, содержащие даже больше информации, чем стандартная справочная система man. Например, если у вас установлен GNU sed и у вас есть файл справки info, вы можете прочитать руководство:

          $ info sed

Документация к Perl (обычно посталяется отдельно от основного комплекта поставки Perl) содержит всестороннюю оперативную страницу руководства по регулярным выражениям в Perl:

          $ man perlre

И даже больше! Оперативная страница руководства man для pcrepattern (поставляемая с приложениемpcretest, как описано выше) также является руководством по регулярным выражениям в Perl.

В заключение, оперативная страница руководства man по regex, доступная на многих UNIX-системах, предоставляет информацию о создании регулярных выражений, поддерживающих интерфейсы POSIX. Информация в этой оперативной странице памяти взята из библиотеки регулярных выражений Генри Спенсера (Henry Spencer's regex library) (см. дополнительную информацию).

Заключение

Множество инструментальных средств и методов доступны на UNIX-системах для создания регулярных выражений. Вы ознакомились с лучшими из них.

Эти инструментальные средства предоставляют прекрасные возможности для создания, тестирования и улучшения регулярных выражений. Использование этих инструментальных средств и приемов в UNIX-системах возможно лучший путь, чтобы научиться создавать сложные регулярные выражения.

Ресурсы

Научиться

Получить продукты и технологии

  • IBM trial software: создайте ваше следующее приложение при помощи программного обеспечения, загруженного прямо со страницы сообщества developerWorks.(EN)
  • GNU Project Web site: загрузите бесплатную копию GNU grep для вашей операционной системы.(EN)
  • PCRE: загрузите бесплатную копию PCRE.(EN)
  • txt2regex script: загрузите бесплатную копию программы txt2regex.(EN)
  • regex: загрузите бесплатную копию библиотек регулярных выражений Генри Спенсера (Henry Spencer's regular expression libraries).(EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX, Open source
ArticleID=267272
ArticleTitle=Регулярные выражения
publish-date=11062007