我们将来还需要支持更多的“格式”。
我们应该选择以下哪种方案:
- 正则表达式 - 简单的字符串搜索(使用string.IndexOf等) - Lex/Yacc - 其他
整体解决方案将在C# 2.0(希望是3.5)中开发。
正则表达式。
正则表达式几乎可以解决所有问题,除了世界和平。嗯,也许连世界和平也能解决。
无论您使用哪种类型的字符串解析,都应该拥有可插拔的系统。因此,该系统会根据电子邮件的类型调用正确的“插件”来解析它。
您必须设计可更新的解决方案,以便在出现未知情况时处理它们。创建一个解析器接口,其中包含解析电子邮件并以标准格式返回结果的方法,还包括检查电子邮件以确定解析器是否执行的方法。
在配置中,确定要使用的解析器类型,设置其配置选项以及确定解析器是否应该运行的标识符的配置。使用程序集限定名称命名解析器,以便即使没有静态链接到其程序集,也可以在运行时实例化类型。
标识符也可以实现接口,因此您可以创建检查不同内容的不同类型。例如,您可能会创建一个正则表达式标识符,该标识符解析特定模式的电子邮件。确保将尽可能多的信息提供给标识符,以便它可以对来自地址以及电子邮件内容等事项进行决策。
当您已知的解析器无法处理工作时,请创建一个新的 DLL,其中包含实现解析器和标识符接口的类型,以处理该工作,并将它们放入 bin 目录中。
这要看您正在解析什么。 对于超出正则表达式处理范围的任何内容,我一直使用ANTLR。 在第一次尝试递归下降解析之前,建议了解其工作原理,然后再尝试使用此框架。如果您订阅MSDN杂志,请查看2008年2月号上关于从头编写递归下降解析的文章。
一旦您理解了基础知识,学习ANTLR就会变得更加容易。还有其他框架可用,但ANTLR似乎得到了最多的社区支持和公共文档。该作者还出版了The Definitive ANTLR Reference: Building Domain-Specific Languages。
正则表达式可能是您最好的选择,经过尝试和验证。此外,正则表达式可以编译。
你最好使用正则表达式,因为它提供了比其他选项更高的灵活性。
虽然你可以使用 IndexOf
来处理某些情况,但你可能很快会发现自己编写的代码像这样:
if(s.IndexOf("search1")>-1 || s.IndexOf("search2")>-1 ||...
这一点可以在一个正则表达式语句中处理。此外,有很多像RegExLib.com这样的地方,你可以找到分享解决问题的正则表达式的人。
@Coincoin 已经涵盖了基本内容;我只是想补充说明,使用正则表达式很容易产生难以阅读和维护的代码。正则表达式是一种功能强大且非常紧凑的语言,所以通常是这样的。
在正则表达式中使用空格和注释可以大大提高其可维护性。Eric Gunnerson 启发了我这个想法。这里有一个例子。
根据您提供的信息,我会选择使用正则表达式。
但是,如果您想要解析什么样的信息以及想要做什么将会改变使用 Lex/Yacc 的决定。
不过看起来您已经决定使用字符串搜索了 :)