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