如何用Python正则表达式提取CPP文件中的CHAR与WCHAR字符串
提取CPP文件中的CHAR与WCHAR字符串方案
嘿,要区分提取CPP文件里的普通双引号CHAR字符串和带L前缀的WCHAR字符串,用正则表达式来处理是最直接的方案,我帮你整理了可行的实现思路和代码,还考虑了转义字符这种容易踩坑的情况:
核心匹配逻辑
CPP里的字符串经常会有转义字符(比如\"、\\),所以正则必须能跳过这些转义的双引号,避免提前终止匹配。对应的规则如下:
- CHAR字符串:匹配以双引号开头,中间包含任意非转义字符(含转义双引号),直到非转义双引号结束的内容,正则表达式为:
"((?:\\.|[^"\\])*)" - WCHAR字符串:在CHAR规则基础上,前面加上大写L前缀(如果需要兼容小写
l,可以改成[Ll]"((?:\\.|[^"\\])*)"),正则表达式为:L"((?:\\.|[^"\\])*)"
C++ 代码实现示例
下面是一个完整的C++程序,能读取指定CPP文件,分别提取两种字符串并输出:
#include <iostream> #include <fstream> #include <regex> #include <vector> #include <string> int main() { // 替换成你的CPP文件路径 std::ifstream target_file("your_target_file.cpp"); if (!target_file.is_open()) { std::cerr << "Error: 无法打开目标文件!" << std::endl; return 1; } // 读取文件全部内容 std::string file_content((std::istreambuf_iterator<char>(target_file)), std::istreambuf_iterator<char>()); target_file.close(); // 提取WCHAR字符串 std::vector<std::wstring> wchar_results; std::wregex wchar_pattern(LR"(L"((?:\\.|[^"\\])*)")"); auto wchar_iter_begin = std::wsregex_iterator(file_content.begin(), file_content.end(), wchar_pattern); auto wchar_iter_end = std::wsregex_iterator(); for (auto iter = wchar_iter_begin; iter != wchar_iter_end; ++iter) { wchar_results.push_back((*iter)[1].str()); } // 提取CHAR字符串 std::vector<std::string> char_results; std::regex char_pattern(R"("((?:\\.|[^"\\])*)")"); auto char_iter_begin = std::sregex_iterator(file_content.begin(), file_content.end(), char_pattern); auto char_iter_end = std::sregex_iterator(); for (auto iter = char_iter_begin; iter != char_iter_end; ++iter) { char_results.push_back((*iter)[1].str()); } // 打印结果 std::cout << "=== 提取到的CHAR字符串 ===" << std::endl; for (const auto& str : char_results) { std::cout << "- " << str << std::endl; } std::wcout << L"\n=== 提取到的WCHAR字符串 ===" << std::endl; for (const auto& str : wchar_results) { std::wcout << L"- " << str << std::endl; } return 0; }
注意事项
- 正则中的
(?:\\.|[^"\\])*是核心:\\.匹配任意转义字符,[^"\\]匹配除双引号和反斜杠外的普通字符,非捕获组(?:...)用来组合这两种情况,避免生成多余的捕获结果。 - 如果你的CPP文件使用特殊编码(比如UTF-16),需要调整文件读取的方式,确保字符处理正确。
- 这个方案会忽略字符串在注释中的情况,如果需要排除注释里的字符串,还需要额外处理注释的匹配逻辑(比如单行
//和多行/* */注释)。
内容的提问来源于stack exchange,提问作者Yoram Abargel
相关产品推荐
相关产品推荐

