我想写一些解析电子邮件的代码,结构如下:
Message-ID: <2252971.1075852681795>
Date: Tue, 31 Jul 2001 05:56:08 -0700 (EST)
From: joebloggs@mail.net
To: jane@othermail.com, john@somemail.net
Subject: A subject goes here
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
X-From: Joe <joebloggs@mail.net>
X-To: Jane <jane@othermail.com>, John, Smith <john@somemail.net>
X-cc:
X-bcc:
X-Folder: \joebloggs\Inbox
X-Origin: Bloggs-J
X-FileName: joebloggs.pst
Hi, this is the information you were looking for...
Sincerely,
Joe
我想编写一些代码将其解析为(例如)内存中的类,然后我可以选择以某种 CSV 格式将其写入磁盘。请注意,(例如)To:
字段可以是多行的。
我想知道的是,我在这里看到的是什么类型的问题?这是编写自定义解析器(并生成某种 DSL)有用的示例,还是我最好将其建模为具有大外循环、一些状态和一些逐行解析输入的函数的状态机, 取决于当前状态是什么?
我可以使用的语言包括 Scala 或 Java..
最佳答案
A parser是一个软件组件,它接受输入数据(通常是文本)并构建数据结构。
解析器 并不总是状态机,但状态机 是实现解析器的一种可能方式。
关于你问题的第二部分。
scala 和 java 有多个解析器库。最受欢迎的是 Parboiled和 scala parser combinators (我个人更喜欢)。
您也可以使用 regular expressions ,这通常可以更快地实现并且更容易解析一些简单的东西(顺便说一句,正则表达式在内部是 FSM)。
对于您的情况,我可能只使用正则表达式。输入的结构看起来非常简单,所以只需将其分成几个部分,然后分别解析每个部分。
关于java - 解析器和状态机有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35739336/