字符串匹配网络流中的块

时间:2015-01-05 08:56:23

标签: algorithm replace network-programming buffer string-matching

我必须处理这样一种情况:需要搜索来自服务器的传入数据以获取字符串,然后用另一个字符串替换(尽可能不缓冲数据。)

传入的数据可以是多个块。因此,给定字符串有可能跨多个块分割。例如,如果字符串是' abc',则块可以是块1:' aaab' &安培;块2:' cbbb'。然后匹配' a'在第一个块中,我们将不得不等待看看是否匹配' b'在下一个块中。这意味着现在我们必须开始缓冲第一个块。或者,至少,匹配的第一个块中的字母需要缓冲,直到我们可以判断第二个块是否包含字符串的其余部分。

如果没有,那么我们将不得不返回第一个块并从字母b重新开始匹配。

鉴于应用程序的限制,需要尽可能避免缓冲。 有没有办法以最小的缓冲实现这一目标?对我来说,这似乎是一个足够通用的问题,在几种情况下会遇到,但不幸的是,我在搜索后找不到任何解决方案或方向。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,要搜索的模式可以完全在一个块中,或者它可以跨越两个或多个块,具体取决于模式和块大小。如果模式是两个块,那么我们需要跟踪在第一个chuck中找到的所有模式前缀(作为后缀),然后在第二个块中搜索相应的模式后缀(作为前缀)。 这里可能需要在每个块上进行多个模式搜索,并且这里可以使用后缀树。 当我们收到一个新的卡盘时,我们已经知道要搜索的所有模式。我们可以制作该块的后缀树,进行所有搜索,根据需要进行处理,然后移动到下一个块,并对其进行相同的操作。

答案 1 :(得分:0)

您可能想看一下有限状态机。 Here's包含一些示例的文字。

假设您要检测“ABCD”模式。在这种情况下,你有五种状态:

  1. 没有找到角色
  2. 已找到A
  3. AB已被发现
  4. ABC已被发现
  5. 已找到ABCD
  6. 机器本身看起来像这样:

               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”等模式。