首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 正則表達式提取文本標簽間內容並保存

     編輯:程式設計綜合問答

需求

文件 A 內容格式:

[fullText]abcd[rating]
[fullText]efg[rating]

提取 [fullText] 和 [rating] 之間的內容,保存到文件 B,不同標簽對內容用空格分隔。

方案:C++11 <regex> 正則提取

#include 
#include 
#include 
#include 
#include 

int main() {
    std::ifstream in("A.txt");
    std::ofstream out("B.txt");
    std::string content((std::istreambuf_iterator(in)), std::istreambuf_iterator());

    // 正則:\[fullText\](.*?)\[rating\]  非貪婪匹配
    std::regex pattern(R"(\[fullText\](.*?)\[rating\])");
    std::smatch match;
    std::vector results;

    std::string::const_iterator start = content.cbegin();
    while (std::regex_search(start, content.cend(), match, pattern)) {
        results.push_back(match[1].str()); // 第 1 捕獲組
        start = match.suffix().first;
    }

    for (size_t i = 0; i < results.size(); ++i) {
        out << results[i];
        if (i + 1 < results.size()) out << ' ';
    }
    return 0;
}

關鍵點

  • 原始字符串字面量 R\"(...)\" 避免轉義混亂。
  • .*? 非貪婪匹配,確保提取最近的 [rating]。
  • match[1] 為第一個捕獲組(括號內內容)。
  • 大文件建議逐行讀取或流式處理,避免一次性載入內存。

替代方案

  • Boost.Regex:C++11 前或需更強大功能(如遞歸模式)。
  • 手寫狀態機:極高性能場景,解析固定格式標簽。
  • Python/腳本預處理:構建階段調用 re.findall 生成中間文件,C++ 僅讀取結果。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved