Algorithm 网络流中跨块的字符串匹配

Algorithm 网络流中跨块的字符串匹配,algorithm,replace,network-programming,buffer,string-matching,Algorithm,Replace,Network Programming,Buffer,String Matching,我必须处理这样一种情况:从服务器传入的数据需要搜索一个字符串,然后替换为另一个字符串(尽可能不缓冲数据) 传入数据可以是多个数据块。因此,一个给定的字符串有可能被分割成多个块。例如,如果字符串是“abc”,则区块可以是区块1:“aaab”和区块2:“cbbb”。然后在匹配第一个块中的“a”之后,我们将不得不等待,看看下一个块中是否有与“b”匹配的。这意味着现在我们必须开始缓冲第一个块。或者,至少,第一个块中匹配的字母需要缓冲,直到我们能够确定第二个块是否包含字符串的其余部分 如果没有,那么我们必

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

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

如果没有,那么我们必须返回到第一个块并从字母b开始重新匹配

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

您可能想看看有限状态机。有一些例子的文本

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

  • 没有找到字符
  • 发现了一个
  • 已经找到了AB
  • 找到了ABC
  • 已找到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
    |-----<---------------<------------<-------------<
    
    IN:A IN:B IN:C IN:D
    州无-->A州-->AB州-->ABC州-->ABCD州
    ^     |               |            |             |             
    || else | else | else|
    |v v v v
    
    |----- 如果我理解正确,要搜索的模式可以完全在一个块中,也可以跨越两个或更多块,具体取决于模式和块大小。若模式在两个块中,那个么我们需要跟踪在第一个chuck中找到的所有模式前缀(作为后缀),然后在第二个块中搜索对应的模式后缀(作为前缀)。 这里可能需要对每个块进行多模式搜索,这里可以使用后缀树。
    当我们收到一个新的卡盘时,我们已经知道所有要搜索的模式。我们可以创建该块的后缀树,进行所有搜索,根据需要进行处理,然后移动到下一个块并对其执行相同的操作。

    除了这些块之外,还有其他边界吗?一个字符串可以跨越多个数据块吗?不,除了发送实际消息之前要发送的消息的长度之外,没有边界。是的,一个字符串可以跨越多个块。谢谢你的回复谢谢你的回复。您描述的过程对于匹配和替换字符串是有效的。所讨论的问题还有一个附加问题,即最小化缓冲。我正在寻找这个问题的标准解决方案,如果有的话。我在回答中提到了缓冲。在状态A时,必须缓冲1个字符(即A),在状态AB时,缓冲最后两个字符(即AB)。在ABC状态下,最后三个(即ABC)等。因此,最大缓冲是模式的长度,如果需要替换整个模式,这是所需缓冲的下限。因此,缓冲是最小的。