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

Попытка анонимизировать полученные заголовки для ретранслируемых сообщений от аутентифицированных пользователей 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 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам