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


    Exim поддерживает использование регулярных выражений во многих своих опциях. Используется библиотека регулярных выражений PCRE; это обеспечивает совместимость регулярных выражений с perl5. Синтаксис и семантика регулярных выражений обсуждаются во многих книгах по perl, и также в Jeffrey Friedl's Mastering Regular Expressions, изданной  O'Reilly (смотрите http://www.oreilly.com/catalog/regex2/).
   Документация о синтаксисе и семантике регулярных выражений включена в текстовом формате в файле
doc/pcrepattern.txt дистрибутива exim, а также в HTML тарболле (архив tar`a - прим. lissyara) документации exim. Там подробно описываются особенности поддержки регулярных выражений PCRE, таким образом нет необходимости включать дальнейшее описание тут. Функции PCRE вызываются из exim`a использованием дефолтовых опций настройки (т.е. без установленной опции PCRE), за исключением того, что опция PCRE_CASELESS установлена, когда используется соответствие без учёта регистра.
   В большинстве случаев, когда регулярные выражения требуются в конфигурации exim`a, они должны начинаться с крышки (
^), для того чтобы отличить их от простого текста, или заканчиваться безразличным символом. В этом примере конфигурационных настроек, второй элемент в списке разделённом двоеточиями, - регулярное выражение.


domains = a.b.c : ^\\d{3} : *.y.z : ...


   Удвоение обратного слэша требуется, поскольку раскрытие строки предшествует интерпретации - смотрите раздел 11.1 для подробного рассмотрения этой темы, и способов не удваивать обратные слэши. Регулярное выражение, использующееся в этом примере, в конечном счёте содержит только один обратный слэш. Крышка включена в него, и её нормальный эффект - постановка на якорь выражения в начале строки.
   Однако, есть два случая, когда где крышка не требуется для распознания регулярного выражения: это условие
match в строке раскрытия и условие matches в файле фильтра exim. В этих случаях, уместная строка всегда обрабатывается как регулярное выражение; если выражение не начинается с крышки, то оно не поствлено на якорь и может соответствовать в любом месте строки объекта.
   Во всех случаях, если вы хотите, чтобы регулярное выражение совпадало с концом строки, вы можете использовать метасимвол
$ для указания этого. Например:


domains = ^\\d{3}\\.example


совпадает с доменом 123.example , но также соответствует 123.example.com . Вам нужно использовать:


domains = ^\\d{3}\\.example\$


если вы хотите чтобы example был доменом высшего уровня. Обратный слэш перед $ необходим, поскольку раскрытие строки также интерпретирует символ доллара.

8.1 Тестирование регулярных выражений

   Программа называемая pcretest является частью дистрибутива PCRE и собирается с PCRE в процессе сборки exim. После сборки exim`a бинарник может быть найден в директории где собирался exim (если она не проинсталлилась где-то автоматически). Существует документация для различных опций в doc/pcretest.txt , но для одиночного теста она не требуется. Это - вывод образца запуска pcretest :

  re> /^([@]+)@.+\.(ac|edu)\.(?!kr)[a-z]{2}$/
data> x@y.ac.uk
 
0
: x@y.ac.uk
 
1
: x
 
2
: ac
data> x@y.ac.kr
No match
data> x@y.edu.com
No match
data> x@y.edu.co
 
0
: x@y.edu.co
 
1
: x
 
2
: edu


Ввод пользователя показан жирным шрифтом. После подсказки re>, ожидается регулярное выражение внутри разделителей. Если оно компилится без ошибок, даётся подсказка data> напротив строки соответствующей выражению. Пустая линия приводит к чтению нового регулярного выражения. Если было успешной совпадение, показываются зафиксированные значения подстроки (то есть, что было бы в переменных 0 $, 1 $, 2 $, и т. д.). Вышеупомянутый пример проверяет на адрес электронной почты, домен которого заканчивается или ac или edu, сопровождаемым двухсимвольным вышестоящим доменом, который не kr. Локальная часть находится в $1 и ac или edu в $2.




=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200