运行C++文件系统代码遇regex_match及字符串转换错误,求原因
错误原因及解决思路
错误1:regex_match函数调用无匹配重载
核心问题是宽、窄字符类型不兼容:Windows平台下std::filesystem::path的string_type是std::wstring(宽字符字符串),但你用的std::smatch是对应窄字符std::string的匹配结果容器,要是std::regex是用窄字符字面量(比如"\\.txt$")构造的,就会和宽字符路径字符串类型不匹配,编译器找不到对应的重载函数。
错误2:无法将basic_string<wchar_t>转换为basic_string
这和上面是同一个根源:你试图把std::wstring(也就是basic_string<wchar_t>)直接转成普通std::string(basic_string<char>),两种字符串底层字符编码不一样,没有默认隐式转换规则,所以编译器报错。
怎么解决
- 统一字符类型就行,两种方案选一个:
- 用宽字符全套组件:把正则改成
std::wregex,匹配结果用std::wsmatch,路径取宽字符版本entry.path().wstring(),比如:std::wregex pattern(L"\\.txt$"); std::wsmatch match; if (std::regex_match(entry.path().wstring(), match, pattern)) { // 处理匹配到的文件 } - 转成窄字符处理:路径调用
entry.path().string()转成std::string,继续用窄字符的std::regex和std::smatch,但要注意Windows下非ASCII路径可能出现乱码问题,比如:std::regex pattern("\\.txt$"); std::smatch match; if (std::regex_match(entry.path().string(), match, pattern)) { // 处理匹配到的文件 }
- 用宽字符全套组件:把正则改成
内容的提问来源于stack exchange,提问作者gimon
相关产品推荐
相关产品推荐

