如何在C++中获取std::regex对象的正则表达式字符串?
解决方案:分C++版本处理
这个问题其实分两种情况,取决于你使用的C版本——毕竟C标准在不同版本里对std::regex的支持是逐步完善的:
1. C++17及更高版本:直接调用标准库接口
从C++17开始,std::regex新增了pattern()成员函数,专门用来返回构造该正则对象时传入的原始模式字符串。这是最简洁的方案:
#include <regex> #include <string> void foo(std::regex r) { std::string ab = r.pattern(); // 这里直接拿到"A.B" }
2. C11/C14版本:自定义包装类
遗憾的是,C11和C14的标准std::regex并没有提供获取原始模式的接口——早期标准库设计时,正则对象可能会把模式编译成内部优化格式,没有要求保留原始字符串。这种情况下,我们需要自己封装一个类,把模式字符串和正则对象绑定在一起:
#include <regex> #include <string> // 自定义包装类,同时保存模式字符串和编译后的正则对象 struct RegexWithPattern { std::string pattern; std::regex regex_obj; // 构造函数,支持传入匹配标志(可选,默认用ECMAScript语法) RegexWithPattern(const std::string& pat, std::regex::flag_type flags = std::regex::ECMAScript) : pattern(pat), regex_obj(pat, flags) {} }; // 修改函数参数为自定义包装类 void foo(RegexWithPattern r) { std::string ab = r.pattern; // 直接获取原始模式字符串 } // 使用示例 int main() { RegexWithPattern reg("A.B"); foo(reg); return 0; }
额外提醒
不要尝试去依赖编译器的非标准扩展(比如某些编译器可能在std::regex的私有成员里存了模式字符串),这种做法移植性极差,换个编译器就会失效。要么升级到C++17及以上,要么用自定义包装类,这两种都是标准且可靠的方案。
内容的提问来源于stack exchange,提问作者Chunde Huang
相关产品推荐
相关产品推荐

