Синтаксис и использование регулярных выражений в конфигурационных файлах exim

Перевод выполнен Алексеем Паутовым в рамках некоммерческого проекта RussianLDP (http://www.rldp.ru/). Именно на этом сайте и надлежит искать новые версии, если таковые будут.

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

Exim поддерживает использование регулярных выражений во многих своих опциях. Используется библиотека регулярных выражений PCRE, это обеспечивает совместимость регулярных выражений с perl5. Синтаксис и семантика регулярных выражений обсуждаются во многих книгах по perl, а также в Jeffrey Friedl's Mastering Regular Expressions, изданной O'Reilly (смотрите http://www.oreilly.com/catalog/regex2/).

Документация о синтаксисе и семантике регулярных выражений включена в текстовом формате в файле doc/pcrepattern.txt дистрибутива exim, а также в HTML-архиве документации на exim. Там подробно описываются особенности поддержки регулярных выражений PCRE, таким образом нет необходимости включать дальнейшее описание тут. Функции PCRE вызываются из exim использованием опций настройки по умолчанию (то есть, без установленной опции PCRE) за исключением того, что опция PCRE_CASELESS установлена, когда используется соответствие без учёта регистра.

В большинстве случаев, когда регулярные выражения требуются в конфигурации exim, они должны начинаться с циркумфлекса (^) для того, чтобы отличить их от простого текста, или заканчиваться безразличным символом. В этом примере конфигурационных настроек второй элемент в списке, разделённом двоеточиями, регулярное выражение:

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 исполняемый файл может быть найден в каталоге, где собирался 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.