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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:39:02