You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:39:34