23.4 映射

关联数组(映射、哈希表)是很多文本处理的关键(key为双关语,有“关键”之意,也有“关键字”之意)。原因很简单:当我们处理文本时,主要工作就是收集信息,而信息通常与文本字符串(如名字、地址、邮政编码、社会保险号、职位等)相关联。即使某些文本字符串可以转换为数值,但通常更方便也更简单的方式还是将它们按文本来处理,并使用此文本作为信息的标识。16.6节中的单词计数的例子是一个很好的简单示例。如果你还不太习惯使用map,请重新阅读16.6节,然后再继续学习本节的内容。

下面我们以电子邮件问题为例来讨论map在文本处理中的应用。我们常常需要搜索和分析电子邮件消息和邮件日志,这一般要借助一些专门程序(如Thunderbird或者Outlook)来完成。利用这些程序,我们不必查看海量的完整邮件内容,就能找到所需的信息。然而,通常我们要查找的信息,如发件人、收件人、发送路径以及其他更多的内容,都是以邮件头中文本的形式呈现给邮件程序的。邮件头已是一条完整的消息,有成千上万的工具可用来分析它。这些工具中的大多数都利用正则表达式(将在23.5~23.9节中进行详细介绍)提取信息,并用某种形式的关联数组关联相关的邮件。例如,我们常常需要查找某个人发送来的所有邮件,或者同一主题的所有邮件,或者内容与特定主题相关的所有邮件。

在这里,我们使用一个非常简单的邮件文件来展示一些从文本文件中提取数据的技术。这个邮件文件的头是来自于www.faqs.org/rfcs/rfc2822.html的实际的RFC2822头。如下所示:

为简单起见,我们已经丢弃了邮件文件中的大部分内容。我们还在每个邮件之后添加了一行“――――”来标识邮件的结束,这进一步简化了邮件的分析。我们将会写一个简短的“玩具程序”,它查找所有“John ...

Get C++程序设计:原理与实践(进阶篇)(原书第2版) now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.