解析字符串的最佳方法是什么?

时间:2020-03-05 18:51:23  来源:igfitidea点击:

我们有一个场景,要求我们解析大量电子邮件(纯文本),每个电子邮件"类型"是针对各种平台运行脚本的结果。有些是制表符分隔的,有些是空格分隔的,有些我们根本不知道。

将来我们也需要支持更多的"格式"。

我们是否可以使用以下方法寻求解决方案:

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

整体解决方案将在C2.0(希望是3.5)中开发

解决方案

回答

正则表达式。

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

回答

正则表达式可能是赌注,尝试和证明。加上正则表达式可以被编译。

回答

无论我们使用哪种类型的字符串解析,我们都应该具有可插拔系统。因此,该系统根据解析电子邮件的类型调用正确的"插件"。

回答

我们提供的信息越少,我就选择Regex。

但是,我们想解析哪种信息以及我们想做什么,可能会将决定更改为Lex / Yacc。

但是看起来我们已经决定使用String搜索了:)

回答

我们说的三种解决方案分别满足非常不同的需求。

手动解析(简单文本搜索)是最灵活,最适应的,但是,由于所需的解析更加复杂,因此它很快就变成了难题。

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

Lex / Yacc实际上仅适用于非常复杂,可预测的语法,并且缺乏很多后期编译灵活性。在中间解析中,我们不能轻易更改解析器,实际上我们可以,但是它太重了,最好使用regex。

我知道这是个好话,这完全取决于确切需求,但是从我们所说的来看,我个人可能会带一袋正则表达式。

作为替代方案,正如Vaibhav所说,如果我们可能会遇到几种不同的情况,并且可以轻松地检测到即将发生的情况,那么我们可以制作一个选择正确算法的插件系统,而这些算法可能完全不同,一个在尖锐的情况下使用Lex / Yacc,另一个在较简单的情况下使用IndexOf和regex。

回答

最好的选择是RegEx,因为它提供了比其他任何选择都更大的灵活性。

虽然可以使用IndexOf处理某些内容,但是我们可能会很快发现自己编写的代码如下:

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

可以在一个RegEx语句中处理。另外,在RegExLib.com等很多地方,我们可以找到共享正则表达式来解决问题的人员。

回答

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

在配置中,确定要使用的解析器的类型,设置其配置选项,以及用于确定解析器是否起作用的标识符的配置。用程序集合格名称命名解析器,以便即使没有静态链接到其程序集也可以在运行时实例化这些类型。

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

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

回答

这取决于我们要解析的内容。对于Regex无法处理的任何事情,我一直在使用ANTLR。在我们第一次进入递归下降解析之前,我将研究它们的工作原理,然后再尝试使用类似的框架。如果我们订阅了《 MSDN杂志》,请查看2008年2月号,那里有一篇有关从头开始编写文章的文章。

一旦我们了解了,学习ANTLR就会容易很多。还有其他框架,但是ANTLR似乎得到了最多的社区支持和公共文档。作者还出版了《权威ANTLR参考:构建领域特定语言》。

回答

@Coincoin已经涵盖了基础;我只想用正则表达式添加它,以难以阅读,难以维护的代码结束就特别容易。正则表达式是一种功能强大且非常紧凑的语言,因此经常会这样。

在正则表达式中使用空格和注释可以大大简化维护正则表达式的过程。埃里克·冈纳森(Eric Gunnerson)使我接受了这个想法。这是一个例子。

回答

使用PCRE。所有其他答案仅是第二名。