【问题标题】:Would regex be a good choice to parse SMTP received lines正则表达式是解析 SMTP 接收行的好选择吗
【发布时间】:2012-04-30 23:50:25
【问题描述】:

我想解析规范中正式定义的RFC822 (SMTP)“已接收”行的元素,例如:

原子 = 1* [...] 收到=“收到”“:”;每个继电器一个 [“来自”域] ;发送主机 [“按”域] ;接收主机 [“通过”原子];物理路径 *("with" 原子) ;链接/邮件协议 ["id" 味精-id] ;接收方消息 ID ["for" 地址规范] ;初始形式 “;”约会时间 ;收到时间 [...] msg-id = "" ;唯一消息 ID [...] addr-spec = 本地部分“@”域;全球地址 等用于域、日期时间等。

这是一个真实的例子:

收到:来自 ll-194.132.162.89.kv.sovam.net.ua (ll-194.132.162.89.kv.sovam.net.ua [83.170.243.194] (可能是伪造的)) by raq2073.uk2.net (8.10.2/8.10.2) 与  的 ESMTP id 为 lASHDDE10765;格林威治标准时间 2007 年 11 月 28 日星期三 17:13:13

正则表达式是捕获接收行的一部分的好策略吗?

我意识到许多 SMTP 服务器没有正确格式化接收到的行(在现实生活中)。

否则,有谁知道 Java 中的库可以很好地做到这一点?

编辑这是一个fiddle,显示了我已经尝试了一段时间的正则表达式和测试,这似乎有效。

Received:\s+(?:from\s+(.+?))?(?:\(qmail (.+?)\))?(?:\s+by\s+(.+?))?(?:\\s+via\s+(.+?))?(?:\s+with\s+(.+?))?(?:\;?\s+id\s+(.+?))?(?:\s+for\s+(.+?))?(?:;\s*(?!.*\;.*)(.+))?$

【问题讨论】:

    标签: java regex smtp


    【解决方案1】:

    选择实际上取决于您想要实现的目标。

    对于捕获 Receiver-line 的特定部分(例如,'give me the From-part'),正则表达式非常棒。

    如果您需要一个成熟的语法分析器,那么仅靠正则表达式是不够的。尤其是 addr-spec 有很多特殊情况,以至于正则表达式无法正确处理每一种情况 (explanation)。正则表达式不是解析器。

    上次我需要一个真正的解析器时,我使用JavaCC 编写了自己的解析器。如果您对语法和解析了解一两件事,我只会建议您走这条路。

    【讨论】:

    • 是的,我只想捕获零件,而不是单独验证它们。
    猜你喜欢
    • 2012-06-25
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2012-10-09
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多