2008-09-11 81 views
6

我们已经有了一个需要我们解析大量电子邮件(纯文本)的场景,每个电子邮件“类型”是脚本在各种平台上运行的结果。有些是制表符分隔的,有些是空格分隔的,有些我们还不知道。解析字符串的最佳方式是什么?

我们还需要在未来支持更多'格式'。

我们怎样去使用的解决方案:

  • 正则表达式
  • 简单的字符串搜索(使用string.IndexOf等)
  • 莱克斯/ Yacc的
  • 其他

整体解决方案将在C#2.0中开发(希望是3.5)

回答

4

您陈述的三种解决方案都涵盖了非常不同的需求。

手动解析(简单文本搜索)是最灵活和最具适应性的,然而,它很快就成为一个真正的麻烦,因为解析需要更复杂。

Regex是一个中间立场,可能是你最好的选择。它们功能强大而灵活,因为您可以从调用不同正则表达式的代码中添加更多逻辑。主要缺点是速度在这里。

Lex/Yacc实际上仅适用于非常复杂,可预测的语法,并且缺少很多后编译灵活性。在解析中,你不能轻易改变解析器,实际上你可以,但它太重了,你最好用正则表达式代替。我知道这是一个陈词滥调答案,这一切都真正归结为你的确切需求,但从你所说的,我个人可能会带着一袋正则表达式。

作为替代,作为Vaibhav的poionted了,如果你有几种不同的情况可能出现,并且您CNA很容易地检测哪一个来了,你能做出选择正确的算法插件系统,并且这些算法可能都非常不同,一个在尖锐的情况下使用Lex/Yacc,另一个在简单的情况下使用IndexOf和正则表达式。

5

正则表达式。

正则表达式可以解决几乎所有的问题,除了世界和平。或许世界和平也是。

+1

我听说Regex负责灌溉柏林墙。 – 2008-09-11 11:53:11

+0

他们确实应该停止在灾难片中使用Nukes。 – Coincoin 2008-09-11 12:19:28

0

正则表达式可能是你bes打赌,尝试和证明。另外还可以编译一个正则表达式。

1

无论使用哪种类型的字符串解析,您可能都应该有一个可插入的系统。所以,这个系统根据电子邮件的类型调用正确的“插件”来解析它。

-1

由于您提供的信息很少,我会选择正则表达式。

但是你要分析,你愿意这样做会改变决定莱克斯/ Yacc的可能是什么什么样的信息..

但它看起来像你已经做了你的心了字符串搜索:)

0

最好的选择是RegEx,因为它提供了比其他选项更大程度的灵活性。

虽然你可以使用IndexOf处理出头,你可能会很快发现自己写的代码看起来像:

if(s.IndexOf("search1")>-1 || s.IndexOf("search2")>-1 ||...

可以在一个正则表达式语句来处理。此外,还有很多地方,如RegExLib.com,您可以找到共享正则表达式来解决问题的人。

1

您必须将您的解决方案设计为可更新,以便在出现问题时处理未知情况。为解析器创建接口,不仅包含解析电子邮件和以标准格式返回结果的方法,还包含检查电子邮件以确定解析器是否将执行的方法。

在您的配置中,确定您希望使用的解析器的类型,设置其配置选项以及确定解析器是否会动作的标识符的配置。通过程序集限定名命名解析器,以便在运行时可以实例化类型,即使没有静态链接到它们的程序集也是如此。

标识符也可以实现一个接口,因此您可以创建检查不同事物的不同类型。例如,您可以创建一个正则表达式标识符,用于解析特定模式的电子邮件。确保为标识符提供尽可能多的信息,以便它可以根据地址和电子邮件的内容来做出决定。

当您的已知解析器无法处理作业时,请创建一个新的DLL,其中包含实现解析器和标识符接口的类型,这些类型可以处理作业并将其放入bin目录中。

1

这取决于你解析的内容。对于Regex无法处理的任何内容,我一直在使用ANTLR。在第一次进入递归下降解析之前,我会研究它们是如何工作的,然后再尝试使用像这样的框架。如果您订阅MSDN Magazine,请查看2008年2月刊,他们有一篇关于从头开始撰写文章的文章。

一旦你理解了,学习ANTLR将会变得更容易。还有其他框架,但ANTLR似乎拥有最多的社区支持和公共文档。作者还发布了The Definitive ANTLR Reference: Building Domain-Specific Languages

0

@Coincoin已经涵盖了基地;我只是想用正则表达式来添加它,特别容易导致难以阅读,难以维护的代码。正则表达式是一种功能强大且非常紧凑的语言,所以这就是它经常发生的事情。

在正则表达式中使用空格和注释可以使维护正则表达式变得更加容易。 Eric Gunnerson把我转到了这个想法。这是an example

0

使用PCRE。所有其他答案只是第二好的。

相关问题