Как преобразовать регулярное выражение из формата 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:]]+)
или, может быть, просто избавиться от проблемы, опустив знак вопроса. за космическим пожирателем следует другой .*
в конце концов.