c++11總結26——std::regex

std::regex 是 C++11 引入的 正則表達式庫,用于 字符串匹配、搜索和替換

🔹 頭文件#include <regex>
🔹 命名空間std
🔹 支持的匹配模式:ECMAScript(默認)、POSIX 規則等。

主要組件

組件作用示例
std::regex正則表達式對象std::regex pattern("\\d+");
std::regex_match完全匹配字符串std::regex_match("123", pattern);
std::regex_search搜索子串匹配std::regex_search("abc123", pattern);
std::regex_replace替換匹配部分std::regex_replace("abc123", pattern, "***");
std::smatch存儲匹配結果(字符串版)std::smatch match;
std::cmatch存儲匹配結果(C 字符串版)std::cmatch match;

基本用法

(1)檢查字符串是否完全匹配

#include <iostream>
#include <regex>int main() {std::string str = "123";std::regex pattern("\\d+");  // 匹配數字if (std::regex_match(str, pattern)) {std::cout << "完全匹配!" << std::endl;} else {std::cout << "匹配失敗!" << std::endl;}
}

(2)搜索字符串中是否包含匹配項

#include <iostream>
#include <regex>int main() {std::string str = "abc123xyz";std::regex pattern("\\d+");  // 查找數字std::smatch match;// std::regex_search() 適用于 查找子字符串是否匹配 的情況if (std::regex_search(str, match, pattern)) {std::cout << "找到匹配: " << match[0] << std::endl;}
}

(3)字符串替換

#include <iostream>
#include <regex>int main() {std::string str = "hello 123 world";std::regex pattern("\\d+");  // 目標:匹配數字// std::regex_replace() 適用于 將匹配項替換為新內容std::string replaced = std::regex_replace(str, pattern, "***");std::cout << "替換后:" << replaced << std::endl;
}

(4)提取多個匹配項

#include <iostream>
#include <regex>int main() {std::string str = "email: test@example.com, contact: user@mail.com";std::regex pattern(R"([\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,})");  // 匹配郵箱std::smatch match;while (std::regex_search(str, match, pattern)) {std::cout << "找到郵箱: " << match[0] << std::endl;str = match.suffix();  // 繼續查找}
}

語法

(1)常見正則語法

表達式作用示例匹配
\d數字"123"
\w字母、數字、下劃線"abc_123"
.任意字符(除換行)"a" "!"
\s空格" "
^字符串開頭^abc 匹配 "abc123" 但不匹配 "1abc"
$字符串結尾abc$ 匹配 "123abc"
+至少一個\d+ 匹配 "123" "4567"
*0 個或多個a* 匹配 "" "a" "aaaa"
?0 或 1 個colou?r 匹配 "color""colour"
{n,m}重復 n 到 m 次\d{2,4} 匹配 "12" "1234"
()分組(\d+)-(\d+)
``

(2)特殊匹配

語法作用
(?:...)非捕獲組
(?=...)正向預查
(?!...)負向預查

存在的問題

1. std::regex 在 GCC 4.8.5 及以下版本崩潰

GCC 4.8.5 的 std::regex 不穩定,容易崩潰

解決方案

  • 升級 GCC 4.9+

  • 使用 boost::regex 代替

  • 使用 pcre 代替

2. std::regex 解析長字符串性能差

解決方案

  • 使用 std::sregex_iterator 遍歷字符串
  • 改用 boost::regexpcre,它們更快。

3. std::regex_replace()處理大文本效率低

解決方案

  • 使用 std::ostringstream 手動拼接字符串,減少替換操作。

方案對比

方法適用場景速度兼容性
std::regexC++11 及以上,簡單匹配較慢僅 C++11+
boost::regexC++98 兼容,功能強大中等兼容 C++98
PCRE高效匹配大文本最快需要安裝
手寫字符串查找僅匹配簡單內容最快兼容所有 C++

總結

功能使用方法
完全匹配std::regex_match(str, pattern);
搜索字符串std::regex_search(str, match, pattern);
替換字符串std::regex_replace(str, pattern, "new");
遍歷所有匹配std::sregex_iterator

推薦

  • 簡單匹配:直接用 std::regex
  • 老版本 C++(C++98/C++03):使用 boost::regex
  • 高性能需求:使用 PCRE

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

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

相關文章

程序詩篇里的靈動筆觸:指針繪就數據的夢幻藍圖<6>

大家好啊&#xff0c;我是小象?(?ω?)? 我的博客&#xff1a;Xiao Xiangζ????? 很高興見到大家&#xff0c;希望能夠和大家一起交流學習&#xff0c;共同進步。 今天我們繼續來學習數組指針變量&#xff0c;二維數組傳參的本質&#xff0c;函數指針變量&#xff0c;…

MySQL時間類型相關總結(DATETIME, TIMESTAMP, DATE, TIME, YEAR)

MySQL時間類型相關總結(DATETIME, TIMESTAMP, DATE, TIME, YEAR) MySQL官方文檔&#xff1a; https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html 一. 對比&#xff1a; 在 MySQL 中&#xff0c;處理時間相關的數據類型主要有以下幾種&#xff1a;DATE、TIME、…

前綴和練習——洛谷P8218:求區間和

題目: 這道題很簡單&#xff0c;直接根據題目無腦套公式 代碼&#xff1a; #include<bits/stdc.h> using namespace std; const int N 1e5 9; using ll long long; ll a[N], perfix[N]; int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//取消同步輸…

【STM32】藍牙模塊數據包解析

使用到的藍牙模塊為DX-BT24&#xff0c;他可以將串口轉藍牙&#xff0c;實現與手機藍牙的通信&#xff0c;本次實現使用手機藍牙發送數據包來控制單片機LED的亮滅&#xff0c;規則如下&#xff1a; AA 05 01 FF AF 該數據包表示包頭為AA&#xff0c;05表示該數據包的大小&#…

NSS-DAY2

Crypto [HNCTF 2022 Week1]A dictator 題目&#xff1a; from random import randint from secret import flagoffset randint(1,100) % 26 # print(offset)assert flag.startswith(NSSCTF{) assert all([ord(c) not in range(ord(A),ord(Z)) for c in flag[7:-1]])for cha…

【vue3 入門到實戰】7. 標簽中的 ref

目錄 1. ref 的作用 2. 如何使用 1. ref 的作用 用于注冊模板引用 用在普通DOM標簽上&#xff0c;獲取的是DOM節點。 用在組件標簽上&#xff0c;獲取的是組件的實例對象。 2. 如何使用 代碼如下 <template><div class"app"><h2 ref"titl…

手寫MVVM框架-實現簡單的數據代理

MVVM框架最顯著的特點就是虛擬dom和響應式的數據、我們以Vue為例&#xff0c;分別實現data、computed、created、methods以及虛擬dom。 這一章我們先實現簡單的響應式&#xff0c;修改數據之后在控制臺打印。 我們將該框架命名為MiniVue。 首先我們需要創建MiniVue的類(src/co…

Redis命令:列表模糊刪除詳解

前言 在Redis中&#xff0c;列表&#xff08;List&#xff09;是一種非常常用的數據結構&#xff0c;允許存儲多個有序的元素。然而&#xff0c;在實際應用中&#xff0c;可能會遇到需要刪除列表中符合某種模式的元素的需求。本文將詳細介紹如何在Redis中實現列表的模糊刪除。…

spy-debugger + Charles 調試移動端/內嵌小程序H5

簡介說明&#xff1a; PC端可以用F12進行console等進行調試&#xff0c;但移動端App中使用webview就無法進行實時調試&#xff0c;針對這種情況 1. 安裝 全局安裝 spy-debugger sudo npm install spy-debugger -g // window不用加sudo2. spy-debugger 證書 其實spy-debugg…

【目標檢測】模型驗證:K-Fold 交叉驗證

K-Fold 交叉驗證 1、引言1.1 K 折交叉驗證概述 2、配置2.1 數據集2.2 安裝包 3、 實戰3.1 生成物體檢測數據集的特征向量3.2 K 折數據集拆分3.3 保存記錄3.4 使用 K 折數據分割訓練YOLO 4、總結 1、引言 我們將利用YOLO 檢測格式和關鍵的Python 庫&#xff08;如 sklearn、pan…

Android studio ternimal 中gradle 指令失效(gradle環境變量未配置)

默認gradle路徑&#xff1a;C:\Users\ylwj.gradle\wrapper\dists\gradle-8.10.2-bin\a04bxjujx95o3nb99gddekhwo\gradle-8.10.2\bin 環境變量-系統環境變量-雙擊path-配置上即可-注意重啟studio才會生效

Axure大屏可視化動態交互設計:解鎖數據魅力,引領決策新風尚

可視化組件/模板預覽&#xff1a;https://8dge09.axshare.com 一、大屏可視化技術概覽 在數據驅動決策的時代&#xff0c;大屏可視化技術憑借直觀、動態的展示方式&#xff0c;已成為眾多行業提升管理效率和優化決策過程的關鍵工具。它能夠將復雜的數據轉化為易于理解的圖形和…

Resnet 改進:嘗試在不同位置加入Transform模塊

目錄 1. TransformerBlock 2. resnet 3. 替換部分卷積層 4. 在特定位置插入Transformer模塊 5. 使用Transformer全局特征提取器 6. 其他 Tips:融入模塊后的網絡經過測試,可以直接使用,設置好輸入和輸出的圖片維度即可 1. TransformerBlock TransformerBlock是Transfo…

PromptSource和LangChain哪個更好

目錄 1. 設計目標與定位 PromptSource LangChain 2. 功能對比 3. 優缺點分析 PromptSource LangChain 4. 如何選擇&#xff1f; 5. 總結 PromptSource 和 LangChain 是兩個在自然語言處理&#xff08;NLP&#xff09;領域非常有用的工具&#xff0c;但它們的設計目標和…

MySQL調優02 - SQL語句的優化

SQL語句的優化 文章目錄 SQL語句的優化一&#xff1a;SQL優化的小技巧1&#xff1a;編寫SQL時的注意點1.1&#xff1a;查詢時盡量不要使用*1.2&#xff1a;連表查詢時盡量不要關聯太多表1.3&#xff1a;多表查詢時一定要以小驅大1.4&#xff1a;like不要使用左模糊或者全模糊1.…

langchain教程-12.Agent/工具定義/Agent調用工具/Agentic RAG

前言 該系列教程的代碼: https://github.com/shar-pen/Langchain-MiniTutorial 我主要參考 langchain 官方教程, 有選擇性的記錄了一下學習內容 這是教程清單 1.初試langchain2.prompt3.OutputParser/輸出解析4.model/vllm模型部署和langchain調用5.DocumentLoader/多種文檔…

如何實現網頁不用刷新也能更新

要實現用戶在網頁上不用刷新也能到下一題&#xff0c;可以使用 前端和后端交互的技術&#xff0c;比如 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;、Fetch API 或 WebSocket 來實現局部頁面更新。以下是一個實現思路&#xff1a; 1. 使用前端 AJAX 或 Fetch…

在ubuntu22.04上先部署docker,再編譯安裝kamailio,附詳細操作流程及docker和makailio的版本號

以下是在Ubuntu 22.04上部署Docker并編譯安裝Kamailio的詳細操作流程&#xff0c;包含版本號信息&#xff1a; 一、部署Docker&#xff08;版本&#xff1a;24.0.7&#xff09; 更新系統包 sudo apt update && sudo apt upgrade -y安裝依賴工具 sudo apt install -y ap…

大模型中提到的超參數是什么

在大模型中提到的超參數是指在模型訓練之前需要手動設置的參數&#xff0c;這些參數決定了模型的訓練過程和最終性能。超參數與模型內部通過訓練獲得的參數&#xff08;如權重和偏置&#xff09;不同&#xff0c;它們通常不會通過訓練自動學習&#xff0c;而是需要開發者根據任…

位運算及常用技巧

涉及位運算的運算符如下表所示&#xff1a; 位運算的運算律&#xff1a; 負數的位運算 首先&#xff0c;我們要知道&#xff0c;在計算機中&#xff0c;運算是使用的二進制補碼&#xff0c;而正數的補碼是它本身&#xff0c;負數的補碼則是符號位不變&#xff0c;其余按位取反…