Как преобразовать регулярное выражение из формата PCRE в формат POSIX, который предупреждает о недействительном операнде оператора повторения? - PullRequest
1 голос
/ 07 января 2012

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

/^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 для использования в файле header_checks Postfix?

1 Ответ

2 голосов
/ 07 января 2012

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

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

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

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

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

...