2012-08-16 237 views
0

试图归档正则表达式以筛选反弹的电子邮件,将它们与垃圾邮件或暂时无法投递的邮件区分开来。正则表达式如果包含XXX但不包含XXX

我们的想法是抓住表达式可能包含的某些单词(代码+单词),但如果它包含其他人(例如(SPAM |临时无法传送|磁盘配额超出)等等,则忽略整行),因为这不会被视为永久性反弹。我们已经管理了第一部分,并在这里找到了一些有关负面正则表达式的答案(http://stackoverflow.com/questions/1153856/string-negation-using-regular-expressions),但是在一个组中混合完全不成功目前为止的判决。

喜欢的东西:

.*(5.3.0|5.1.0).*(User unknown|invalid|Unknown address|doesn't have a) 

但不匹配其他任何地方,如果在同一行中包含XXX的话。喜欢的东西:

^(?!(SPAM|temporarily undeliverable|disk quota exceeded)).*$ 

因此,下面第一行会匹配,但第二个不应该

Diagnostic-Code: smtp; 5.3.0 - Other mail system problem 554-"delivery error: dd This user doesn't have a btinternet.com account ([email protected]) [0] - mta1000.bt.mail.ird.yahoo.com" (delivery attempts: 0)

Diagnostic-Code: smtp; 5.1.0 - Unknown address error 550-'RCPT TO: Mailbox disk quota exceeded' (delivery attempts: 0)

回答

2

你只在字符串为您否定的开始搜索。你只需要添加一个.*

尝试

^(?!.*(SPAM|temporarily undeliverable|disk quota exceeded)).*(5.3.0|5.1.0).*(User unknown|invalid|Unknown address|doesn't have a) 

看到它here on Regexr

+0

简单;)谢谢。为测试做了一些额外的改进和实际工作,似乎很好:http://regexr.com?31rp2 – luison 2012-08-16 11:37:44