2012-01-07 3 views
1

Попытки анонимной полученные заголовки для ретрансляционных сообщений от авторизованных пользователей постфиксных, есть пример из https://we.riseup.net/debian/anonymizing-postfix:Как преобразовать регулярное выражение из PCRE в формат POSIX, который предупреждает о некорректном операнде оператора-повтора?

/^Received: from (.* \([-._[:alnum:]]+ \[[.[:digit:]]{7,15}\]\)).*?([[:space:]]+).*\(Authenticated sender: ([^)]+)\).*by (auk\.riseup\.net) \(([^)]+)\) with (E?SMTPS?A?) id ([A-F[:digit:]]+).*/ REPLACE Received: from [127.0.0.1] (localhost [127.0.0.1])$2(Authenticated sender: $3)${2}with $6 id $7 

При редактировании файла regexp:/etc/postfix/header_checks результата является сообщением об ошибке:

линии 15: повторения -оператор недействителен

Теперь я предполагаю, что указанное выше регулярное выражение находится в формате PCRE, где мой Postfix запрашивает регулярное выражение, совместимое с POSIX.

Как сделать вышеуказанное регулярное выражение POSIX regexp совместимым для использования в файле postfix header_checks?

ответ

2

Ваша догадка верна, .*? является конструкцией PCRE: .* является нормальным «любым персонажем, как можно больше раз, по крайней мере, в нулевое время», а задний вопросительный знак изменяет значение «... как несколько раз возможное ...". SUSv4 говорит:

Поведение нескольких соседних символов дублирования ('+', '*', '?' И интервалов) дает неопределенные результаты.

я не изучал рисунок слишком много, но вы должны быть в состоянии работать вокруг этой конкретной несовместимости: следующий подмасок ([[:space:]]+), так что вы должны быть в состоянии переформулировать как «любой некосмических character ... ":

[^[:space:]]*([[:space:]]+) 

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

+0

Спасибо, @just_somebody это помогло. Проверенный для работы POSIX regexp: для постфикса стал '/^Received: from (. * \ ([-._ a-zA-Z0-9] + \ [[. 0-9] {7,15} \] \)) (. * [[: space:]] +) \ (Аутентифицированный отправитель: ([^)] +) \) (. *) by (host \ .domain \ .tld) ​​\ (([^)] +) \) с (E? SMTPS? A?) id ([A-F0-9] +) (. * \))/REPLACE Получено: от [127.0.0.1] (localhost [127.0.0.1]) $ 2 (проверено отправитель: $ 3) $ {4} на $ 5 ($ 6) с $ 7 id $ 8 $ 9' –