我正在使用以下正则表达式更改通过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
任何建议???
答案 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)尽可能具有特定优势......正则表达式更清楚地表明其意图是其中之一。
答案 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