【发布时间】:2012-10-02 20:12:57
【问题描述】:
我正在寻找一种对数据流进行操作的正则表达式匹配的实现——即,它有一个 API,允许用户一次传入一个字符并在找到匹配项时报告到目前为止看到的字符流。只需要非常基本(经典)的正则表达式,因此基于 DFA/NFA 的实现似乎非常适合该问题。
基于可以在单次线性扫描中使用 DFA/NFA 进行正则表达式匹配的事实,流式实现似乎应该是可能的。
要求:
库应该不尝试等到完整的字符串被读取后再执行匹配。我真正拥有的数据是流式传输的;没有办法知道有多少数据会到达,不可能向前或向后搜索。
为几个特殊情况实施特定的流匹配不是一种选择,因为我事先不知道用户可能想要寻找什么模式。
语言:可用于 C/C++
出于好奇,我的用例如下:我有一个在完整系统模拟器中拦截内存写入的系统,我想有一种方法来识别与正则表达式匹配的内存写入(例如,可以使用它来查找系统中将 URL 写入内存的点)。
我找到了:
Applying a regular expression to a Java I/O Stream
Code Guru - Building a Regular Expression Stream Search with the .NET Framework
但所有这些都试图先将流转换为字符串,然后使用常用的正则表达式库。
我的另一个想法是修改RE2 library,但according to the author 是围绕整个字符串同时在内存中的假设构建的。
如果没有可用的东西,那么我可以开始重新发明这个轮子以满足我自己的需求的不幸道路,但如果我可以避免它,我真的宁愿不这样做。任何帮助将不胜感激!
【问题讨论】:
-
你说必须读取完整的字符串,然后才能读取整个流并存储处理?
-
抱歉,这是一个错误的错字。数据是流式传输的,我们不能等到最后才处理它(通过的数据总量超过 100 GB)。
-
这是一个幼稚的解决方案,但您始终可以保留流的最后 n 个字节的缓冲区并对其应用正则表达式。根据您的要求,它可能适合您。