流数据的高效(基本)正则表达式实现

时间:2012-10-12 03:34:47

标签: regex stream dfa nfa

我正在寻找一种对数据流进行操作的正则表达式匹配的实现 - 也就是说,它有一个API,允许用户一次传入一个字符并报告何时找到匹配到目前为止看到的人物流。只需要非常基本的(经典)正则表达式,因此基于DFA / NFA的实现似乎非常适合该问题。

基于在单个线性扫描中使用DFA / NFA进行正则表达式匹配的事实,似乎应该可以实现流式实现。

要求:

  • 库应该尝试等待,直到读完整个字符串,然后再执行匹配。我的数据确实是流媒体;没有办法知道会有多少数据到达,也无法向前或向后寻找。

  • 为一些特殊情况实现特定的流匹配不是一种选择,因为我事先并不知道用户可能想要查找的模式。

  • 语言:可从C / C ++中使用

对于好奇,我的用例如下:我有一个系统拦截整个系统模拟器中的内存写入,我想有一种方法来识别与正则表达式匹配的内存写入(例如,可以使用它来查找系统中将URL写入内存的点。)

我找到了:

Apply a Regex on Stream?

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它的构建围绕着整个字符串同时在内存中的假设。

如果没有什么可用,那么我可以开始重新发明这个轮子的不愉快的道路以满足我自己的需要,但如果我能避免它,我真的不愿意。任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:5)

我正是您正在寻找的内容:https://github.com/agentzh/sregex http://agentzh.org/misc/slides/yapc-na-2013-sregex.pdf

如果你知道javascript(或想要一个javascript版本),我有一个练习,可以让你轻松地使用现有的RE实现:https://github.com/dhruvbird/regexp-js

答案 1 :(得分:1)

英特尔发布了hyperscan库,可以完全满足需要。 Here它是对它的简要概述。

答案 2 :(得分:0)

Brian W. Kernighan and Rob Pike看一下像这样的旧grep实现。它们处理缓冲区中的文本流,并应用于简单的正则表达式规则,甚至不应用于BRE。

答案 3 :(得分:0)

遗憾的是,对此的“回答”是没有用于执行此操作的预构建库。相反,我选择了以下折衷:我实现了一个简单的字符串匹配器(没有RE支持),它使用每个流和每个搜索字符串使用单个计数器来保持状态,该搜索字符串跟踪在该流中匹配了多少搜索字符串的字符。它会随着每个正确的字符递增,并在找到不匹配的字符时重置为零。这很快,不需要太多的内存开销。

对于更复杂的搜索,我只是将所有流转储到磁盘,然后使用传统工具搜索它们。它非常慢,但幸运的是,我们的大多数用例都可以通过简单的字符串匹配来实现。

相关问题