主题标题的postfix正则表达式更改

时间:2014-12-01 14:34:38

标签: regex postfix-mta

我正在使用以下正则表达式更改通过postfix发送的邮件的主题

/等/后缀/ header_checks

/^Subject: System command Run on (.*)-(.*)-(.*)\.(.*)/ REPLACE Subject: System command Run on $4 $2$3
/^Subject: System command Run on (.*)-(.*)-(.*)\.(.*)\.(.*)/ REPLACE Subject: System command Run on $5 $2$3

表示来自此主机的任何邮件

server-env-01.app

将被第一个过滤器捕获并且主题将被更改

和具有此格式的主机名

server-prod-01.loc.dc1

将被第二个过滤器

捕获

但是第二个过滤器没有被使用,因为第一个过滤器也用于主机名,格式为server-prod-01.loc.dc1

任何建议???

2 个答案:

答案 0 :(得分:1)

您的问题是.*尽可能多地匹配每个字符 并超出您想要的子匹配。实际上,每个.*都会直接到字符串的末尾,“只返回”字符,只要它必须允许表达式的其余部分完成。这称为贪婪匹配,是正则表达式引擎的默认行为。

因此,在使用*时,您必须具体。

"server-prod-01.loc.dc1"的各个细分受众群是白名单(如[a-z0-9]*\w*)或黑名单[^\s.-]*

在你的情况下,我认为\w*就足够了。它既不匹配-也不匹配.,因此无法超越。

^Subject: System command Run on (\w*)-(\w*)-(\w*)\.(\w*)

^Subject: System command Run on (\w*)-(\w*)-(\w*)\.(\w*)\.(\w*)

另一种方法是使用非贪婪量词(*?或更好+?,因为*也匹配零个字符):

^Subject: System command Run on (.+?)-(.+?)-(.+?)\.(.+?)

虽然a)并非所有引擎都支持非贪婪匹配,b)尽可能具有特定优势......正则表达式更清楚地表明其意图是其中之一。


阅读about repetition and greedyness

答案 1 :(得分:0)

以下工作正常......虽然我从Tomalak上面得到了一些回应。

if /^Subject:/
/^Subject: System command run on \b([^.-]*)-([^.-]*)-([^.-]*)\.([^.-]*)\b$/ REPLACE Subject: System command run on $4 $2$3
/^Subject: System command run on \b([^.-]*)-([^.-]*)-([^.-]*)\.([^.-]*)\.([^.-]*)$/ REPLACE Subject: System command run on $5 $2$3
endif