如何在NSData对象中进行多次搜索?

时间:2016-04-11 20:08:56

标签: nsdata string-matching aho-corasick

TL,DR

请参阅NSData的此成员函数(在Swift中):

func rangeOfData(_ dataToFind: NSData, options mask: NSDataSearchOptions, range searchRange: NSRange) -> NSRange

我想用Set(或其他集合)NSData替换第一个参数并返回第一个匹配项。数据模式可以是另一个的子集,因此返回最长匹配。有什么想法吗?

我听说这种方法在实现中使用了像Boyer-Moore这样的东西。所以我的扩展可能会使用像Aho-Corasick这样的东西。

太长了......

我想阅读电子邮件文件。

我打算一次读一行文件,所以我需要一个换行检测算法。标准是CRLF,但我应该扫描just-CR,just-LF和(完成)LFCR。注意我正在阅读二进制文件,其中二进制文本在稍后阶段完成,因此所有NSStringNSRegularExpression内容都无法帮助我。

我打算写一个自定义例程,然后我意识到我可以概括它。我创建了一个解析树节点类,一行生成器的骨架类,以及一堆测试。我已经拖延了代码的内容:输入字节扫描,创建解析树和遍历解析树。我仍然在第二次环顾四周时拖延,因为这似乎是我们的程序员祖先必须做的问题并且已经有代码。

这一次,我发现了字符串匹配算法,所以希望我更近一步(除了将它们翻译成Swift)。

或许我应该放弃泛化并在每个周期两次传递中调用rangeOfData: options: range:,一次用于CR,一次用于LF并调和它们。但这是低效的。或保持自定义列表的想法;为每个模式创建一个带有分支的树,将前缀重叠与具有多个节点的分支统一。 (如果向后搜索,请使用以后缀为导向的分支!)此处多次传递将更加低效。

请注意,NSData具有将其数据作为一系列块进行遍历的功能。我打算使用该功能,但我必须小心,模式可以分成两个(或更多!)块。

0 个答案:

没有答案