Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';解析字符串的最佳方法是什么?_C#_Email_Parsing_Projects And Solutions - Fatal编程技术网

C# 什么';解析字符串的最佳方法是什么?

C# 什么';解析字符串的最佳方法是什么?,c#,email,parsing,projects-and-solutions,C#,Email,Parsing,Projects And Solutions,我们有一个场景需要解析大量电子邮件(纯文本),每个电子邮件“类型”都是在不同平台上运行脚本的结果。有些是制表符分隔的,有些是空格分隔的,有些我们还不知道 我们将来也需要支持更多的“格式” 我们是否使用以下方法寻求解决方案: 正则表达式 简单的字符串搜索(使用string.IndexOf等) 莱克斯/雅克 其他 整个解决方案将在C#2.0(希望是3.5)中开发 Regex几乎可以解决除世界和平之外的所有问题。好吧,也许世界也会和平。正则表达式可能是你最好的选择,经过实践验证。此外,还可以编译正

我们有一个场景需要解析大量电子邮件(纯文本),每个电子邮件“类型”都是在不同平台上运行脚本的结果。有些是制表符分隔的,有些是空格分隔的,有些我们还不知道

我们将来也需要支持更多的“格式”

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

  • 正则表达式
  • 简单的字符串搜索(使用string.IndexOf等)
  • 莱克斯/雅克
  • 其他
整个解决方案将在C#2.0(希望是3.5)中开发


Regex几乎可以解决除世界和平之外的所有问题。好吧,也许世界也会和平。

正则表达式可能是你最好的选择,经过实践验证。此外,还可以编译正则表达式。

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

只要您提供的信息很少,我就选择Regex

但是您想要解析什么样的信息,以及您想要做什么,可能会将决策更改为Lex/Yacc


但看起来您已经决定使用字符串搜索:)

您所述的三种解决方案各自涵盖了非常不同的需求

手动解析(简单文本搜索)是最灵活和适应性最强的,但是,由于所需的解析更为复杂,它很快就会成为一个真正的麻烦

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

Lex/Yacc实际上只适用于非常复杂、可预测的语法,并且缺乏很多编译后的灵活性。您不能在解析过程中轻易地更改解析器,事实上您可以,但它太重了,您最好改用正则表达式

我知道这是一个老生常谈的回答,这实际上取决于你的确切需求,但从你所说的,我个人可能会带上一包regex


作为备选方案,正如Vaibhav Poiont指出的那样,如果你有几种不同的情况可能会出现,并且你可以很容易地发现哪种情况会出现,你可以制作一个插件系统来选择正确的算法,这些算法可能都非常不同,一种是在尖锐的情况下使用Lex/Yacc,另一种是在更简单的情况下使用IndexOf和regex。

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

虽然您可以使用
IndexOf
来处理某些事情,但您可能会很快发现自己编写的代码如下所示:

if(s.IndexOf(“search1”)>-1 | s.IndexOf(“search2”)>-1 | |……


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

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

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

标识符也可以实现一个接口,因此您可以创建不同的类型来检查不同的内容。例如,您可以创建一个正则表达式标识符,用于解析电子邮件中的特定模式。请确保标识符可以获得尽可能多的信息,以便它可以对诸如从地址到作为电子邮件的内容


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

这取决于您正在解析的内容。对于超出正则表达式可处理范围的任何内容,我一直在使用。在您跳转到递归下降解析之前第一次,在尝试使用这样的框架之前,我会研究它们是如何工作的。如果你订阅了MSDN杂志,请查看2008年2月的一期,那里有一篇关于从头开始编写的文章


一旦你理解了,学习ANTLR就会容易得多。还有其他的框架,但ANTLR似乎拥有最多的社区支持和公共文档。作者也发表了文章。

@Coincoin已经涵盖了这些基础;我只想补充一点,使用regex,尤其容易以难以阅读的内容结束,哈Regex是一种功能强大且非常紧凑的语言,所以它经常使用这种语言


在正则表达式中使用空格和注释可以大大简化正则表达式的维护。Eric Gunnerson让我想到了这个想法。这里是。

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

我听说正则表达式负责拆除柏林墙。他们确实应该停止在灾难电影中使用核武器。正则表达式:原因它可以让你进行不同类型的搜索文本、正则表达式等。它是一个编译库,可以让你在这么多的平台上做这么多事情,并且经过多年的测试。它可能比你将要编写的实现快得多。