postfix pcre Regex匹配并替换substring

时间:2012-12-06 13:56:30

标签: regex postfix-mta

我正在使用Postfix MTA并从破损的MTA(我无法解决,因为它不在我的控制范围内)获取重要邮件,它以下列格式发送:

RCPT TO: <+49 (681) 12345678>

我需要的是:

RCPT TO: 4968112345678

所以我正在寻找一个正则表达式,首先检查字符串是否以“RCPT TO:”开头,如果这是真的,则需要删除其后的所有特殊字符,以便只有[a-zA-Z0-剩下9个。

Postfix为此类正则表达式提供了一个示例:

# Work around clients that send RCPT TO:<'user@domain'>.
# WARNING: do not lose the parameters that follow the address.
#/^RCPT\s+TO:\s*<'([^[:space:]]+)'>(.*)/     RCPT TO:<$1>$2

但几个小时后我无法适应我的需要。

提前致谢, 马可

2 个答案:

答案 0 :(得分:2)

似乎是,在通用情况下不可能剥离任何非字母数字字符的组合。但对于像示例中给出的地址,这个正则表达式应该足够了:

/^[^a-z0-9]*([a-z0-9]+)[^a-z0-9]*([a-z0-9]+)[^a-z0-9]*([a-z0-9]+)$/     $1$2$3

您可以通过postmap命令测试正则表达式映射:

$ postmap -q "+49 (681) 12345678" pcre:/path/to/regexp_map
4968112345678

要使用此正则表达式映射,请添加到postfix config

canonical_maps = prce:$config_directory/regexp_map

阅读有关canonical_maps的ADDRESS_REWRITING_README

答案 1 :(得分:1)

尝试:/[^RCPT\sTO\:\s]([a-zA-Z0-9]+)/过滤掉导致49 681 12345678的所有字母数字值。 [1]

另一个更好的方法是黑名单所有不需要的字符也可以是一个选项,但听起来不是最佳的。 /([^<+\)\(>]+)/会产生RCPT TO: 49 681 12345678[2]

或许最好的选择是捕获/(\w+|:)/的任何单词字符(字母,数字,下划线)RCPT TO: 49 681 12345678[3]

所有这些都是用rubular测试的,我不知道Postfix MTA。但我希望这会有所帮助。

固定链接:

  1. http://www.rubular.com/r/Uapn2m52yk
  2. http://www.rubular.com/r/015iyaNG3T
  3. http://www.rubular.com/r/mmJZBNbH99