3

我使用<regex>的是 Visal Studio 2010。我知道当我创建正则表达式对象时,它会被编译。没有像其他语言和库那样的编译方法,但我认为它是这样工作的,对吗?

我需要将大量编译的正则表达式存储在一个文件中,这样我就可以得到一块内存块并得到我编译的正则表达式。

我不知道该怎么做。我发现在 PCRE 中它是可能的,但它是 Linux 库。有一个 Windows [版本2,但它已有 3 年历史,我想使用更高级的方法(Windows 版本中没有 c++ 包装器)。

那么是否可以使用 savestd:regexboost::regex(它是一样的权利?)作为一块内存,然后简单地重用它?

或者是否有其他简单的 Windows 库允许这样做?

编辑: 感谢您的出色回答。我将简单地检查将正则表达式存储为字符串是否足够,然后如果它仍然很慢,我将对其进行测试并将其与这个旧的 PCRE 库进行比较。

4

3 回答 3

2

您可以将正则表达式字符串本身用作“序列化”正则表达式 - 只需将它们保存到文件中,然后当您想要重构regex对象时,只需将保存的字符串传递给regex构造函数。

我能想到的唯一缺点:

  • “重建”正则表达式数据库可能需要更多时间,但我真的不知道多少(我怀疑时间无论如何都会由 I/O 主导,所以我不确定差异是否很大- 我真的不知道boost库的实现在正则表达式编译中有多少开销)
  • 如果您希望存储的正则表达式被混淆,您必须自己做,而不是依赖编译的二进制状态不可读

这样做的好处是:

  • 它是 100% 支持的,所以它不是易碎/易碎的
  • 它可以跨编译器版本和平台移植(即,不易碎/易碎)

编译正则表达式数据库(不包括 I/O)的时间真的足够多,足以保证尝试保存编译状态吗?

于 2010-12-21T18:30:19.337 回答
1

我认为如果不修改 boost 库来支持它就无法完成。

我不知道具体的 boost regex 库是如何实现的,但大多数 regex 库将事物编译为二进制 blob,然后稍后将其解释为一种有限虚拟机的一系列指令。

如果boost的regex库是这样实现的,序列化会比较容易。只是以某种方式获取二进制 blob 并将其转储到磁盘。boost 库的POSIX regex API的存在告诉我,这可能就是它的实现方式。

OTOH,实现它的另一种方法(也是一种不太常见的方法)是为正则表达式生成抽象语法树之类的东西。这意味着正则表达式的各个部分将由它们自己的对象表示,并且这些对象将链接在一起形成代表整个正则表达式的更大结构。

如果 boost 这样做,那么序列化将非常复杂。

这在 C++ 中是不可能的,但我真正希望发生的是 boost 可以在编译时使用模板元编程编译常量字符串正则表达式。这是不可能的原因是不可能使用模板迭代字符串(甚至是常量字符串)的内容。

于 2010-12-21T14:40:11.260 回答
0

我不确定,但是您是否看过boost::serialization,它可以序列化 C++ 对象?

于 2010-12-21T14:21:34.727 回答