我正在使用Visal Studio 2010中的<regex>
。
我明白,当我创建正则表达式对象时,它就被编译了。没有像其他语言和库那样的编译方法,但我认为它是如何工作的,我是对的吗?
我需要将大量此编译的正则表达式存储在一个文件中,这样我就可以得到一块内存块并获得我编译的正则表达式。
我无法想象如何做到这一点。我发现在PCRE中它是possible但它是Linux库。有一个Windows [版本2,但它已经有3年了,我想使用更高级的方法(在Windows版本中没有c ++包装器)。
那么可以使用save std:regex
或boost::regex
(它是相同的吗?)作为一块内存然后只是稍后再使用它?
或者是否有其他简单的Windows库允许这样做?
修改 谢谢你的答案。我只是检查将一个正则表达式作为字符串存储就足够了,然后如果它仍然很慢,我将测试并将它与这个旧的PCRE库进行比较。
答案 0 :(得分:2)
您可以将正则表达式字符串本身用作“序列化”正则表达式 - 只需将它们保存到文件中,然后当您想要重新构建regex
对象时,只需将保存的字符串传递给regex
构造
我能想到的唯一缺点是:
这样做的好处是:
编译正则表达式数据库(不包括I / O)的时间是否足以保证尝试保存编译状态?
答案 1 :(得分:1)
如果不修改boost库来支持它,我认为不能做到这一点。
我不知道具体如何实现boost正则表达式库,但大多数正则表达式库将事物编译为二进制blob,然后将其解释为一系列有限虚拟机的指令。
如果以这种方式实现boost的正则表达式库,那么序列化它会相对容易。只是以某种方式获取二进制blob并将其转储到磁盘。升级库的POSIX regex API的存在告诉我这可能是它的实现方式。
OTOH,实现它的另一种方式(以及一种不常见的方式)是为正则表达式生成类似抽象语法树的东西。这意味着正则表达式的各个部分将由它们自己的对象表示,并且这些对象将被链接在一起形成一个代表整个正则表达式的更大的结构。如果boost以这种方式执行,那么序列化将非常复杂。
使用C ++是不可能的,但我真正希望发生的是boost可以在编译时使用模板元编程编译常量字符串正则表达式。这是不可能的原因是不可能用模板迭代字符串的内容(甚至是常量字符串)。
答案 2 :(得分:0)
我不确定,但你看了boost::serialization,它可以序列化一个C ++对象吗?