部分正则表达式匹配

3
我有一个正则表达式,正在测试字符输入流。我想知道是否有一种方法可以将正则表达式与输入匹配,并确定它是否是消耗整个输入缓冲区的部分匹配?也就是说,在正则表达式完成之前到达了输入缓冲区的末尾。我希望实现能够决定是等待更多的输入字符还是中止操作。
换句话说,我需要确定哪一个是正确的:
1. 正则表达式匹配之前到达了输入缓冲区的末尾 例如:"foo" =~ /^foobar/ 2. 正则表达式完全匹配 例如:"foobar" =~ /^foobar/ 3. 正则表达式未能匹配 例如:"fuubar" =~ /^foobar 输入没有被分组。
2个回答

0

这是你要解决的场景吗?你正在等待一个字面字符串,例如'foobar'。如果用户输入了部分匹配,例如'foo',则您希望继续等待。如果输入不匹配,则希望退出。

如果您正在使用字面字符串,则只需编写循环以按顺序测试字符。或者,

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

如果您正在尝试匹配更复杂的正则表达式,我不知道如何使用正则表达式来实现。但是,我建议您先阅读有关平台如何实现正则表达式的更多信息。

汤姆


0

我不确定这是否是你的问题,但是。
正则表达式要么匹配,要么不匹配。而且表达式将匹配可变数量的输入。因此,它不能直接确定。

然而,如果您认为有可能重叠,可以使用智能缓冲方案来完成相同的事情。

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

一种方法是通过断言匹配所有不匹配的内容,直到获得匹配的开始(但不是您寻找的完整匹配)。 这些你只需扔掉并从缓冲区中清除。当您获得所需的匹配时,请清除该数据及其之前的数据。

例如:/(<function.*?>)|([^<]*)/ 你需要扔掉/清除的部分在第二组捕获缓冲区中。

另一种方法是,如果您正在匹配有限长度的字符串,如果在缓冲区中没有匹配任何内容,则可以安全地从缓冲区开头到缓冲区末尾减去您正在搜索的有限字符串的长度之间全部丢弃。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接