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.