2

TL,博士

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具有将其数据作为一系列块进行遍历的功能。我打算使用那个函数,但我必须小心,一个模式可能会被分成两个(或更多!)块。

4

0 回答 0