部分正则表达式匹配

我有一个正则表达式,我正在测试输入的字符流。 我想知道是否有一种方法可以将正则表达式与输入匹配,并确定它是否是消耗整个输入缓冲区的部分匹配? 即在r​​egexp完成之前到达输入缓冲区的末尾。 我希望实现决定是等待更多的输入字符,还是中止操作。

换句话说,我需要确定哪一个是真的:

  1. 在匹配正则表达式之前已达到输入缓冲区的末尾

    例如"foo" =~ /^foobar/

  2. 正则表达式完全匹配

    例如"foobar" =~ /^foobar/

  3. 正则表达式无法匹配

    例如"fuubar" =~ /^foobar

输入未打包。

这是你要解决的问题吗? 您正在等待文字字符串,例如’foobar’。 如果用户键入部分匹配,例如’foo’,则您希望保持等待。 如果输入是不匹配的,则要退出。

如果你正在处理文字字符串,我会写一个循环来按顺序测试字符。 要么,

 If (input.Length < target.Length && target.StartsWith(input)) // keep trying 

如果您正在尝试匹配更复杂的正则表达式,我不知道如何使用正则表达式执行此操作。 但我首先要阅读更多关于平台如何实现正则表达式的内容。

汤姆

我不确定这是不是你的问题。
正则表达式匹配与否。 表达式将匹配可变数量的输入。 所以,它无法直接确定。

但是,如果您认为存在重叠的可能性,则可以使用智能缓冲方案来完成同样的事情。

有很多方法可以做到这一点。

一种方法是匹配所有不匹配的断言,直到你得到一个匹配的开始(但不是你寻找的完整匹配)。 这些你可以简单地从你的缓冲区扔掉并清除。 当您获得匹配时,请清除该数据和数据的缓冲区。

示例:/(< /()|([^<]*)/ .*?>)|([ /()|([^<]*)/ <]*)/从缓冲区中丢弃/清除的部分位于第2组捕获缓冲区中。

另一种方法是如果你匹配有限长度的字符串,如果你不匹配缓冲区中的任何东西,你可以放心地从缓冲区的开头到缓冲区的末尾减去你正在搜索的有限字符串的长度对于。

示例:您的缓冲区大小为64k。 您正在搜索长度为10的字符串。在缓冲区中找不到它。 您可以安全地清除(64k - 10)字节,保留最后10个字节。 然后将(64k-10)个字节追加到缓冲区的末尾。 当然,您只需要一个10字节大小的缓冲区,不断删除/添加1个字符,但更大的缓冲区更有效,您可以使用阈值重新加载更多数据。

如果您可以创建容易收缩/扩展的缓冲区,则可以使用更多缓冲选项。