首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将已编译的正则表达式(std::regex)保存/序列化到文件中?

如何将已编译的正则表达式(std::regex)保存/序列化到文件中?
EN

Stack Overflow用户
提问于 2010-12-21 05:35:37
回答 3查看 2.2K关注 0票数 3

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

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

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

那么,是否可以使用保存std:regexboost::regex (这是相同的权利?)作为一块内存,然后再简单地重用它呢?

或者,还有其他简单的Windows库允许这样做吗?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-21 06:40:11

我认为如果不修改boost库来支持它,就无法做到这一点。

我不知道boost regex库是如何实现的,但是大多数regex库都会将其编译成二进制blob,然后将二进制blob解释为针对某种有限虚拟机的一系列指令。

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2010-12-21 10:30:19

您可以使用regex字符串本身作为“序列化”regex --只需将这些字符串保存到一个文件中,然后当您想要重新构造regex对象时,只需将保存的字符串传递给regex构造函数即可。

我能想到的唯一缺点是:

  • “重建”regex数据库可能需要更多的时间,但我真的不知道要花多少时间(我怀疑时间将被I/O支配,所以我不确定这种差异是否会很大--我真的不知道boost库的实现在regex编译中有多少开销)
  • 如果要混淆存储的regexes,则必须自己执行,而不是依赖编译后的二进制状态不可读。

这样做的好处是:

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

编译regex数据库(不包括I/O)的时间是否真的足够值得尝试保存已编译状态?

票数 2
EN

Stack Overflow用户

发布于 2010-12-21 06:21:34

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4499808

复制
相关文章
MySQL实现统计数据并插入数据的存储过程
统计存储过程,这里是将统计的结果插入一个表中,后台可以有定时任务来调此存储过程。以下业务是统计仓库中商品流转情况,包括:日期、商品总数、入库数量、出库数量。
用户8983410
2021/11/01
1.2K0
MySQL - MySQL不同存储引擎下索引的实现
MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,我们这里主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。
小小工匠
2021/08/17
1K0
java中==、equals的不同AND在js中==、===的不同
       1.==操作符:首先,对于非基本数据类型的对象比较,相同内存中存储的变量的值是否相等,注意是相同内存地址的才可,并且数值相同(当然地址相同,值也一定相同)才会返回true.     但是,对于基本数据类型的比较(比如:int flot double等),值相同,"=="比较便会返回true.(这是编译的规则,当进行基本数据类型的比较时,会编译生成if_icmpne指令不会进行比较地址。而进行对象比较时,会生成if_icmpne指令,会比较地址。生成的指令都是不同的)。
洋仔聊编程
2019/01/15
4K0
mysql—mysql中如何存储日期数据
1,特点 1)以YYYY-MM-DD HH:MM:SS[.fraction]格式存储日期时间,在mysql5.6前可以只能存储到秒,在5.6后能存储到微秒 2)datetime类型与时区无关,占用8个字节的存储空间 3)时间范围公元1000-01-01 00:00:00到9999-12-31 23:59:59,存储的时间范围非常广
全栈程序员站长
2021/04/07
5K0
MySQL---数据库从入门走向大神系列(八)-在java中执行MySQL的存储过程
http://blog.csdn.net/qq_26525215/article/details/52143733
谙忆
2021/01/21
1.1K0
MySQL---数据库从入门走向大神系列(八)-在java中执行MySQL的存储过程
MySQL统计数据库所有表的数据量
场景:mysql统计一个数据库里所有表的数据量,最近在做统计想查找一个数据库里基本所有的表数据量,数据量少的通过select count再加起来也是可以的,不过表的数据有点多,不可能一个一个地查
SmileNicky
2021/12/14
6.9K0
MySQL统计数据库所有表的数据量
在 git 中如何配置用户信息
最近买了台新的笔记本,重新装了一些软件,这次就说说怎么在 git 中配置用户信息吧。
前端西瓜哥
2022/12/21
1K0
在Linux中如何禁止用户登录
默认情况下,创建用户时,将按照/etc/default/useradd文件中定义的为用户分配shell。
用户9104802
2021/11/22
6.7K0
SpringBoot中@Transaction在不同MySQL引擎下的差异性
在springboot进行事务测试的时候,发现事务没有生效,在方法上添加了@Transactional注解并让方法先执行插入操作,接着再抛出个异常,触发事务回滚,代码如下:
是Vzn呀
2022/07/14
1K0
SpringBoot中@Transaction在不同MySQL引擎下的差异性
MySQL中的存储引擎
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
changxin7
2019/09/10
1.8K0
MySQL存储过程,视图,用户管理
一张虚拟表,就是将一个经常被使用的查询作为一个虚拟表,开发者查询的时候不需要再次书写SQL,而是直接调用对应的视图就可,调用视图以后MySQL会执行这个查询SQL。
石的三次方
2021/01/05
9380
在 Kubernetes 中,如何动态配置本地存储?
Kubernetes 中使用节点的本地存储资源有 emptyDir、hostPath、Local PV 等几种方式。这之中,emptyDir 无法持久化数据,hostPath 方式需要手动管理卷的生命周期,运维压力大。因此在某些场景下,如果用户出于性能和运维成本考虑需要使用本地存储,Local PV 似乎是唯一选择。
CNCF
2019/12/05
3.4K0
在 Kubernetes 中,如何动态配置本地存储?
mysql中的数据库对用户权限做限制
mysql中限定用户对数据库的权限 默认的MySQL安装之后根用户是没有密码的 先用根用户进入: # mysql -u root 执行: mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY “123456”; 用的是123456做为root用户的密码,我这里是做个例子,要是用123456做密码 那还不象不设置密码了:)
全栈程序员站长
2021/07/23
4K0
在python中操作MySQL数据库
本篇主要介绍如何使用pymysql操作数据库,下面直接进入正文 1.查询数据 # coding: utf-8 # author: hmk import pymysql.cursors # 连接数据库 conn = pymysql.connect(host='localhost', # 数据库地址 port=3306, #端口默认是3306,不写这个也可以,如果不是3306则需要在此声明 user='root',
冰霜
2022/03/15
4.5K0
在 Kubernetes 中,如何动态配置本地存储?
Kubernetes 中使用节点的本地存储资源有 emptyDir、hostPath、Local PV 等几种方式。这之中,emptyDir 无法持久化数据,hostPath 方式需要手动管理卷的生命周期,运维压力大。因此在某些场景下,如果用户出于性能和运维成本考虑需要使用本地存储,Local PV 似乎是唯一选择。
kubernetes中文社区
2019/08/27
3.1K0
在 Kubernetes 中,如何动态配置本地存储?
审计对存储在MySQL 8.0中的分类数据的更改
使用敏感信息时您需要拥有审计日志。通常,此类数据将包含一个分类级别作为行的一部分,定义如何处理、审计等策略。在之前的博客中,我讨论了如何审计分类数据查询。本篇将介绍如何审计对机密数据所做的数据更改。
MySQLSE
2020/11/25
4.7K0
tcpdump在mySQL数据库中的应用实践
tcpdump在我们平时运维中充当了很重要的角色,对复杂问题的排查、分析起到了至关重要的作用,确实为运维中的一大利器。
MySQL数据库技术栈
2020/08/05
5.2K0
tcpdump在mySQL数据库中的应用实践
点击加载更多

相似问题

没有在Ruby线程中执行的代码

23

主线程的执行上下文

32

线程没有执行

21

用于的输出通道的并发(线程执行器)

11

如何使用主动通道对话在通道中启动新线程?

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文