C++ 正則表達式分組捕獲入門指南

在 C++ 中,正則表達式(regex)是一種用于匹配字符串模式的強大工具。正則表達式不僅能幫助你查找符合特定模式的字符,還能捕獲匹配的子字符串(即分組捕獲)。這篇文章將介紹 C++ 正則表達式中的分組捕獲機制,并提供多個示例代碼來幫助你快速入門。

一、基本概念:正則表達式分組捕獲

正則表達式分組捕獲是一種能夠將匹配的部分提取出來的技術。在 C++ 中,正則表達式分組捕獲通常通過小括號 () 來實現。每個分組會捕獲匹配到的子字符串,并且可以在代碼中通過相應的索引訪問它們。

分組的基本語法
  • ():用于定義捕獲分組。你可以在正則表達式中使用多個分組,C++ 中從 1 開始對分組編號。
示例:簡單分組捕獲

假設我們需要從一個日期字符串中提取年月日,可以使用正則表達式中的分組捕獲來實現。

二、C++ 正則表達式庫:<regex>

在 C++ 中使用正則表達式時,需要包含頭文件 <regex>。基本的正則表達式操作包括:

  • std::regex:正則表達式對象。
  • std::smatch:保存匹配結果的對象。
  • std::regex_search:查找匹配。
  • std::regex_match:完全匹配整個字符串。
  • std::regex_replace:替換匹配的字符串。

三、示例代碼:日期分組捕獲

我們可以編寫一個示例程序,從一個字符串中提取出日期的年、月和日。

示例 1:提取日期(YYYY-MM-DD

假設我們有一個日期字符串 2023-02-25,并希望通過正則表達式捕獲出年、月、日。

#include <iostream>
#include <regex>
#include <string>int main() {std::string input = "2023-02-25";// 正則表達式:捕獲年、月和日std::regex pattern(R"((\d{4})-(\d{2})-(\d{2}))");std::smatch matches;// 如果匹配成功if (std::regex_match(input, matches, pattern)) {// 輸出捕獲的各個分組std::cout << "Year: " << matches[1] << std::endl;std::cout << "Month: " << matches[2] << std::endl;std::cout << "Day: " << matches[3] << std::endl;} else {std::cout << "No match found." << std::endl;}return 0;
}
代碼解析:
  1. 正則表達式

    R"((\d{4})-(\d{2})-(\d{2}))"
    

    • (\d{4}) 捕獲4位數字(即年份)。
    • (\d{2}) 捕獲2位數字(即月份和日期)。
  2. matches[1]matches[2]matches[3] 分別存儲匹配到的年份、月份和日期。

輸出:
Year: 2023
Month: 02
Day: 25

四、捕獲多個匹配

有時我們需要從文本中查找多個匹配項。std::regex_search 可以用于查找匹配,但它只會找到第一個匹配項。如果你想捕獲所有匹配項,可以使用 std::regex_iterator

示例 2:提取所有匹配的日期

假設我們有一段文本,其中包含多個日期,我們希望提取所有日期。

#include <iostream>
#include <regex>
#include <string>
#include <iterator>int main() {std::string input = "The event will be held on 2023-02-25, followed by another on 2024-03-01.";// 正則表達式:捕獲日期std::regex pattern(R"((\d{4})-(\d{2})-(\d{2}))");std::smatch matches;// 使用 regex_iterator 查找所有匹配auto begin = std::sregex_iterator(input.begin(), input.end(), pattern);auto end = std::sregex_iterator();for (auto it = begin; it != end; ++it) {std::cout << "Found date: " << it->str() << std::endl;}return 0;
}
輸出:
Found date: 2023-02-25
Found date: 2024-03-01
使用 std::regex_search 來查找日期的所有匹配
#include <iostream>
#include <regex>
#include <string>int main() {std::string input = "The event will be held on 2023-02-25, followed by another on 2024-03-01.";// 正則表達式:捕獲日期std::regex pattern(R"((\d{4})-(\d{2})-(\d{2}))");std::smatch matches;// 使用 cbegin 和 cend 來獲取常量迭代器auto begin = input.cbegin();while (std::regex_search(begin, input.cend(), matches, pattern)) {// 輸出匹配到的日期std::cout << "Found date: " << matches[0] << std::endl;// 更新搜索起始位置,繼續從上一個匹配位置之后開始搜索begin = matches[0].second;}return 0;
}
輸出:
Found date: 2023-02-25
Found date: 2024-03-01

五、捕獲和替換(regex_replace

正則表達式不僅可以用于查找和捕獲,還可以用于替換匹配的內容。通過 std::regex_replace,你可以將捕獲到的內容替換成新的內容。

示例 3:替換日期格式

假設我們希望將日期格式從 YYYY-MM-DD 更改為 DD/MM/YYYY

#include <iostream>
#include <regex>
#include <string>int main() {std::string input = "The event will be held on 2023-02-25, and another on 2024-03-01.";// 正則表達式:捕獲日期std::regex pattern(R"((\d{4})-(\d{2})-(\d{2}))");// 使用 regex_replace 將日期格式替換為 DD/MM/YYYYstd::string output = std::regex_replace(input, pattern, R"($3/$2/$1)");std::cout << "Updated text: " << output << std::endl;return 0;
}
輸出:
Updated text: The event will be held on 25/02/2023, and another on 01/03/2024.

六、進階應用:捕獲多個分組

當正則表達式中有多個分組時,你可以通過 matches[n] 訪問每個分組的捕獲結果。

示例 4:捕獲多個分組(例如,提取姓名和年齡)
#include <iostream>
#include <regex>
#include <string>int main() {std::string input = "John Doe, Age: 30; Jane Smith, Age: 25";// 正則表達式:捕獲姓名和年齡std::regex pattern(R"((\w+ \w+), Age: (\d+))");std::smatch matches;// 查找匹配auto begin = std::sregex_iterator(input.begin(), input.end(), pattern);auto end = std::sregex_iterator();for (auto it = begin; it != end; ++it) {std::cout << "Name: " << it->str(1) << ", Age: " << it->str(2) << std::endl;}return 0;
}
輸出:
Name: John Doe, Age: 30
Name: Jane Smith, Age: 25

七、總結

正則表達式的分組捕獲是一個非常強大的工具,它能夠讓你輕松提取和操作字符串中的特定部分。C++ 中的 <regex> 庫提供了靈活的接口,允許你使用正則表達式進行模式匹配、捕獲分組、查找多個匹配項以及進行替換操作。通過本文的示例代碼,希望你能掌握 C++ 中正則表達式分組捕獲的基礎應用,并能在實際項目中靈活使用正則表達式來處理文本數據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70889.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70889.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70889.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Docker方式一鍵部署MySQL和Redis數據庫詳解

一、前言 數據庫是現代應用開發中不可或缺的一部分&#xff0c;MySQL和Redis作為兩種廣泛使用的數據庫系統&#xff0c;分別用于關系型數據庫和鍵值存儲。本文旨在通過Docker和Docker Compose的方式&#xff0c;提供一個簡潔明了的一鍵部署方案&#xff0c;確保數據庫服務的穩…

性能附錄:如何計算并發用戶數(摘自高樓老師《性能30講》)

高樓老師《性能30講》: 性能測試實戰30講-極客時間 感興趣的同學可以去讀一下&#xff0c;個人感覺寫的非常好 目錄 什么是并發? 在線用戶數、并發用戶數怎么計算 總結 什么是并發? 我們假設上圖中的這些小人是嚴格按照這個邏輯到達系統的&#xff0c;那顯然&#xff0c;…

基于yolov8的糖尿病視網膜病變嚴重程度檢測系統python源碼+pytorch模型+評估指標曲線+精美GUI界面

【算法介紹】 基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統 基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統是一款利用深度學習技術&#xff0c;專為糖尿病視網膜病變早期診斷設計的智能輔助工具。該系統采用YOLOv8目標檢測模型&#xff0c;結合經過標注和處理的醫學影像數…

學習路程八 langchin核心組件 Models補充 I/O和 Redis Cache

前序 之前了解了Models&#xff0c;Prompt&#xff0c;但有些資料又把這塊與輸出合稱為模型輸入輸出&#xff08;Model I/O&#xff09;?&#xff1a;這是與各種大語言模型進行交互的基本組件。它允許開發者管理提示&#xff08;prompt&#xff09;&#xff0c;通過通用接口調…

DeepSeek 開源狂歡周(五)正式收官|3FS并行文件系統榨干SSD

千呼萬喚始出來&#xff01;在 DeepSeek 開源周 的第五天&#xff0c;今日正式收官&#xff01;在大模型訓練中&#xff0c;每個epoch都在與存儲系統進行光速競賽——數據加載延遲會扭曲計算時空&#xff0c;KVCache訪問瓶頸將引發推理坍縮。DeepSeek開源的 3FS文件系統&#x…

特征工程中的三大向量化工具詳解

特征工程中的三大向量化工具詳解 在文本處理和特征工程中&#xff0c;TfidfVectorizer、CountVectorizer 和 DictVectorizer 是常用的工具&#xff0c;用于將原始數據轉換為機器學習模型可用的數值特征。以下是它們的核心區別、用法及示例&#xff1a; 1. CountVectorizer&…

C++ Qt常見面試題(4):Qt事件過濾器

在 Qt 中,事件過濾器(Event Filter)提供了一種機制,可以攔截并處理對象的事件(如鼠標事件、鍵盤事件等),在事件到達目標對象之前對其進行預處理。事件過濾器通常用于以下場景: 捕獲和處理特定的事件(如鼠標點擊、按鍵等);對事件進行篩選或修改;實現全局的事件監聽功…

TCP基本入門-簡單認識一下什么是TCP

部分內容來源&#xff1a;小林Coding TCP的特點 1.面向連接 一定是“一對一”才能連接&#xff0c;不能像 UDP 協議可以一個主機同時向多個主機發送消息&#xff0c;也就是一對多是無法做到的 2.可靠的 無論的網絡鏈路中出現了怎樣的鏈路變化&#xff0c;TCP 都可以保證一個…

PING命令TTL解析

在 ping 命令中&#xff0c;TTL&#xff08;Time to Live&#xff0c;生存時間&#xff09; 是 IP 數據包的核心字段之一&#xff0c;用于控制數據包在網絡中的生命周期。以下是針對 TTL 的簡明解析&#xff1a; 1. TTL 的核心作用 防循環機制&#xff1a;TTL 是一個計數器&a…

PySide(PyQT)重新定義contextMenuEvent()實現鼠標右鍵彈出菜單

在 PySide中&#xff0c;contextMenuEvent() 是 QWidget 類&#xff08;以及繼承自它的所有子類&#xff09;的一個事件處理方法&#xff0c;主要用于處理上下文菜單事件&#xff0c;也就是當用戶在控件上右鍵點擊時觸發的事件。 ? 通過重新定義contextMenuEvent()來實現自定…

GitHub SSH連接問題解決指南

&#x1f50d; GitHub SSH連接問題解決指南 問題描述 遇到錯誤&#xff1a;ssh: connect to host github.com port 22: Connection refused 說明您的網絡環境無法訪問GitHub的SSH端口22&#xff0c;常見原因&#xff1a; 防火墻/網絡運營商限制&#xff08;國內常見&#xf…

Go紅隊開發—并發編程

文章目錄 并發編程go協程chan通道無緩沖通道有緩沖通道創建?緩沖和緩沖通道 等協程sync.WaitGroup同步Runtime包Gosched()Goexit() 區別 同步變量sync.Mutex互斥鎖atomic原子變量 SelectTicker定時器控制并發數量核心機制 并發編程階段練習重要的細節端口掃描股票監控 并發編程…

RabbitMQ 的介紹與使用

一. 簡介 1> 什么是MQ 消息隊列&#xff08;Message Queue&#xff0c;簡稱MQ&#xff09;&#xff0c;從字面意思上看&#xff0c;本質是個隊列&#xff0c;FIFO先入先出&#xff0c;只不過隊列中存放的內容是message而已。 其主要用途&#xff1a;不同進程Process/線程T…

常用的AI文本大語言模型匯總

AI文本【大語言模型】 1、文心一言https://yiyan.baidu.com/ 2、海螺問問https://hailuoai.com/ 3、通義千問https://tongyi.aliyun.com/qianwen/ 4、KimiChat https://kimi.moonshot.cn/ 5、ChatGPThttps://chatgpt.com/ 6、魔塔GPT https://www.modelscope.cn/studios/iic…

在自己的數據上復現一下LlamaGen

git倉庫&#xff1a;https://github.com/FoundationVision/LlamaGen 數據集準備 如果用ImageFolder讀取&#xff0c;則最好和ImageNet一致。 data_path/class_1/image_001.jpgimage_002.jpg...class_2/image_003.jpgimage_004.jpg......class_n/image_005.jpgimage_006.jpg.…

Go入門之接口

type Usber interface {start()stop() } type Phone struct {Name string }func (p Phone) start() {fmt.Println(p.Name, "啟動") } func (p Phone) stop() {fmt.Println(p.Name, "關機") } func main() {p : Phone{Name: "華為手機",}var p1 U…

【數據結構進階】哈希表

&#x1f31f;&#x1f31f;作者主頁&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所屬專欄&#xff1a;數據結構 目錄 前言 一、哈希表的概念 二、哈希函數的實現方法 1. 直接定址法 2. 除留余數法 三、哈希沖突 1. 開放定址法&#xff08;閉散列&#xff0…

《深度學習實戰》第4集:Transformer 架構與自然語言處理(NLP)

《深度學習實戰》第4集&#xff1a;Transformer 架構與自然語言處理&#xff08;NLP&#xff09; 在自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;Transformer 架構的出現徹底改變了傳統的序列建模方法。它不僅成為現代 NLP 的核心&#xff0c;還推動了諸如 BERT、…

高效管理 React 狀態和交互:我的自定義 Hooks 實踐

高效管理 React 狀態和交互&#xff1a;自定義 Hooks 實踐 在 React 中&#xff0c;Hooks 是一種使我們能夠在函數組件中使用狀態和副作用的強大工具。隨著項目的增大&#xff0c;重復的邏輯可能會出現在多個組件中&#xff0c;這時使用自定義 Hooks 就非常合適。它們幫助我們…

Exoplayer(MediaX)實現音頻變調和變速播放

在K歌或錄音類應用中變調是個常見需求&#xff0c;比如需要播出蘿莉音/大叔音等。變速播放在影視播放類應用中普遍存在&#xff0c;在傳統播放器Mediaplayer中這兩個功能都比較難以實現&#xff0c;特別在低版本SDK中&#xff0c;而Exoplayer作為google官方推出的Mediaplayer替…