我正在使用Visal 2010的<regex>
。我知道,当我创建regex对象时,它就被编译了。没有像其他语言和库那样的编译方法,但我认为这就是它的工作方式,对吗?
我需要将大量的编译后的正则表达式存储在一个文件中,这样我就可以得到内存块并获得编译的regex。
我不知道该怎么做。我发现在PCRE中,它是可能,但它是Linux库。有一个视窗[版本2,但它已经3年了,我想使用更高层次的方法(在Windows版本中没有c++包装)。
那么,是否可以使用保存std:regex
或boost::regex
(这是相同的权利?)作为一块内存,然后再简单地重用它呢?
或者,还有其他简单的Windows库允许这样做吗?
编辑:,谢谢你的回答。我将简单地检查将正则表达式作为字符串存储是否足够,然后如果它仍然很慢,我将与这个旧的PCRE库进行测试和比较。
发布于 2010-12-21 06:40:11
我认为如果不修改boost库来支持它,就无法做到这一点。
我不知道boost regex库是如何实现的,但是大多数regex库都会将其编译成二进制blob,然后将二进制blob解释为针对某种有限虚拟机的一系列指令。
如果boost的regex库是以这种方式实现的,那么序列化它就比较容易了。以某种方式获取二进制blob并将其转储到磁盘。boost库中POSIX正则表达式API的存在告诉我,它可能就是这样实现的。
OTOH,实现它的另一种方法(以及一种不那么常见的方法)是为regex生成类似抽象语法树的东西。这意味着正则表达式的各个部分将由它们自己的对象表示,而这些对象将连接在一起,形成代表整个正则表达式的更大的结构。
如果boost这样做,那么序列化将非常复杂。
这在C++中是不可能的,但我真正希望的是boost可以在编译时使用模板元编程编译常量字符串正则表达式。之所以不可能这样做,是因为不可能用模板迭代字符串的内容(甚至是常量字符串)。
发布于 2010-12-21 10:30:19
您可以使用regex字符串本身作为“序列化”regex --只需将这些字符串保存到一个文件中,然后当您想要重新构造regex
对象时,只需将保存的字符串传递给regex
构造函数即可。
我能想到的唯一缺点是:
这样做的好处是:
编译regex数据库(不包括I/O)的时间是否真的足够值得尝试保存已编译状态?
发布于 2010-12-21 06:21:34
我不确定,但是您看过boost::序列化,它可以序列化C++对象吗?
https://stackoverflow.com/questions/4499808
复制相似问题