我必须处理这样一种情况:需要搜索来自服务器的传入数据以获取字符串,然后用另一个字符串替换(尽可能不缓冲数据。)
传入的数据可以是多个块。因此,给定字符串有可能跨多个块分割。例如,如果字符串是' abc',则块可以是块1:' aaab' &安培;块2:' cbbb'。然后匹配' a'在第一个块中,我们将不得不等待看看是否匹配' b'在下一个块中。这意味着现在我们必须开始缓冲第一个块。或者,至少,匹配的第一个块中的字母需要缓冲,直到我们可以判断第二个块是否包含字符串的其余部分。
如果没有,那么我们将不得不返回第一个块并从字母b重新开始匹配。
鉴于应用程序的限制,需要尽可能避免缓冲。 有没有办法以最小的缓冲实现这一目标?对我来说,这似乎是一个足够通用的问题,在几种情况下会遇到,但不幸的是,我在搜索后找不到任何解决方案或方向。
答案 0 :(得分:1)
如果我理解正确,要搜索的模式可以完全在一个块中,或者它可以跨越两个或多个块,具体取决于模式和块大小。如果模式是两个块,那么我们需要跟踪在第一个chuck中找到的所有模式前缀(作为后缀),然后在第二个块中搜索相应的模式后缀(作为前缀)。 这里可能需要在每个块上进行多个模式搜索,并且这里可以使用后缀树。 当我们收到一个新的卡盘时,我们已经知道要搜索的所有模式。我们可以制作该块的后缀树,进行所有搜索,根据需要进行处理,然后移动到下一个块,并对其进行相同的操作。
答案 1 :(得分:0)
您可能想看一下有限状态机。 Here's包含一些示例的文字。
假设您要检测“ABCD”模式。在这种情况下,你有五种状态:
机器本身看起来像这样:
IN:A IN:B IN:C IN:D
STATE_NONE ---> STATE_A ---> STATE_AB ---> STATE_ABC ---> STATE_ABCD
^ | | | |
| |else |else |else |
| v v v v
|-----<---------------<------------<-------------<
机器在STATE_NONE处关闭并一次处理输入的一个字符。例如,如果当前状态是STATE_A并且B到达,那么我们移动到STATE_AB。但是在STATE_A我们得到“C”,我们转到STATE_NONE。对于检测,在每个步骤中,您只需要存储机器的当前状态。但是,由于您还想要替换检测到的模式,因此在每个状态下,您必须存储从STATE_NONE到当前状态的最后几个字节。
编辑:
我的状态机缺少一些状态转换。从STATE_AB开始,如果“A”到达,我们必须返回STATE_A,而不是STATE_NONE。状态A,ABC和ABCD也是如此 - 如果A到达,则返回STATE_A。否则,你会错过“ABCABCD”等模式。