如何将正则表达式从PCRE转换为POSIX格式,警告重复操作符操作数无效?

时间:2012-01-07 03:41:44

标签: regex posix pcre postfix-mta

尝试对收到的来自经过身份验证的后缀用户的中继邮件的标头进行匿名处理,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 regexp兼容,以便在Postfix header_checks文件中使用?

1 个答案:

答案 0 :(得分:2)

你的预感是正确的,.*?是一个PCRE结构:.*是正常的“任何字符,尽可能多次,至少为零次”,并且尾随问号将其更改为“ ......尽可能少......“。 SUSv4说:

  

多个相邻复制符号('+','*','?'和interval)的行为会产生不确定的结果。

我没有过多地研究过这个模式,但你应该能够解决这个特殊的不兼容问题:下一个子模式是([[:space:]]+),所以你应该能够将它重新表述为“任何非-space 字符......“:

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

或者可能只是通过省略问号来解决问题。毕竟,太空之后是另一个.*