部分正则表达式匹配

时间:2011-01-21 14:14:20

标签: ruby regex partial

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

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

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

    E.g。 "foo" =~ /^foobar/

  2. 正则表达式完全匹配

    E.g。 "foobar" =~ /^foobar/

  3. 正则表达式无法匹配

    E.g。 "fuubar" =~ /^foobar

  4. 输入未打包。

2 个答案:

答案 0 :(得分:0)

这是您要解决的方案吗?您正在等待文字字符串,例如'foobar的'。如果用户键入部分匹配,例如'foo',你想继续等待。如果输入是不匹配的,则要退出。

如果您正在使用文字字符串,我只需编写一个循环来按顺序测试字符。或者,

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

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

汤姆

答案 1 :(得分:0)

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

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

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

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

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

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

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

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