C++中正則表達式詳解和實戰示例

C++ 中的正則表達式(Regular Expression)主要通過標準庫 <regex> 提供,能夠用于字符串匹配、查找、替換、驗證格式等。它在 C++11 中首次引入,并在 C++14 和 C++17 中逐步完善。


一、頭文件和命名空間

#include <regex>
#include <string>
#include <iostream>using namespace std;

二、主要類介紹

類名功能描述
std::regex用于存儲正則表達式模式
std::smatch用于存儲匹配結果(string 匹配)
std::cmatch用于存儲匹配結果(C字符串匹配)
std::regex_match判斷整個字符串是否匹配正則模式
std::regex_search判斷字符串中是否有匹配正則的部分
std::regex_replace替換匹配的字符串內容

三、常見正則表達式語法

正則語法含義
.匹配任意單個字符
*匹配前面的字符 0 次或多次
+匹配前面的字符 1 次或多次
?匹配前面的字符 0 次或 1 次
^匹配字符串開頭
$匹配字符串結尾
[]匹配方括號內任一字符
``或運算符
()子表達式分組
\d數字
\w單詞字符(字母/數字/下劃線)
\s空白字符

四、示例代碼

1. 使用 regex_match 完全匹配

string s = "abc123";
regex pattern("[a-z]+\\d+"); // 小寫字母 + 數字if (regex_match(s, pattern)) {cout << "完全匹配成功" << endl;
} else {cout << "匹配失敗" << endl;
}

2. 使用 regex_search 局部匹配

string s = "hello 123 world";
regex pattern("\\d+"); // 匹配數字smatch result;
if (regex_search(s, result, pattern)) {cout << "找到數字:" << result.str() << endl;
}

3. 使用 regex_replace 字符替換

string s = "abc123xyz456";
regex pattern("\\d+"); // 匹配數字string replaced = regex_replace(s, pattern, "#");
cout << replaced << endl; // 輸出:abc#xyz#

4. 捕獲多個子匹配

string s = "Name: John, Age: 25";
regex pattern("Name: (\\w+), Age: (\\d+)");smatch match;
if (regex_search(s, match, pattern)) {cout << "姓名:" << match[1] << endl;cout << "年齡:" << match[2] << endl;
}

5. 匹配郵箱格式示例

string email = "user123@example.com";
regex pattern("[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}");if (regex_match(email, pattern)) {cout << "郵箱格式合法" << endl;
} else {cout << "郵箱格式錯誤" << endl;
}

五、匹配模式(flag)

正則對象可以設置模式:

regex pattern("abc", regex_constants::icase); // 忽略大小寫

常用標志位:

標志名含義
regex_constants::icase忽略大小寫
regex_constants::ECMAScript默認模式,支持現代語法
regex_constants::basic基本正則
regex_constants::extended擴展正則(如 POSIX)

六、性能提示

  • regex 在 C++11 初期實現性能一般,現代編譯器已優化。
  • 對于頻繁匹配,可復用 std::regex 對象,避免重復構造。
  • 若性能要求極高,可考慮 RE2 等替代庫(Google)。

七、綜合實戰示例

下面以為 日志過濾文件名匹配表單驗證 的完整 C++ 正則表達式示例,每個都附詳細解釋,幫助大家實際應用。


1、日志過濾:提取指定格式的日志(如錯誤信息)

目標:從日志中提取 [ERROR] 級別的信息

#include <iostream>
#include <regex>
#include <string>
#include <vector>using namespace std;int main() {vector<string> logs = {"[INFO] 2025-07-14 Connection established","[ERROR] 2025-07-14 Disk not found","[WARN] 2025-07-14 High memory usage","[ERROR] 2025-07-14 Timeout occurred"};regex error_pattern(R"(\[ERROR\]\s+(\d{4}-\d{2}-\d{2})\s+(.*))");for (const auto& log : logs) {smatch match;if (regex_match(log, match, error_pattern)) {cout << "日期: " << match[1] << ", 錯誤信息: " << match[2] << endl;}}return 0;
}

輸出:

日期: 2025-07-14, 錯誤信息: Disk not found
日期: 2025-07-14, 錯誤信息: Timeout occurred

2、文件名匹配:匹配特定后綴的文件(如 .txt.log

#include <iostream>
#include <regex>
#include <vector>using namespace std;int main() {vector<string> filenames = {"report.txt", "data.csv", "log_2025.log", "notes.TXT", "script.cpp"};regex txt_log_pattern(R"((.*)\.(txt|log))", regex_constants::icase); // 忽略大小寫cout << "匹配的文件名:" << endl;for (const auto& name : filenames) {if (regex_match(name, txt_log_pattern)) {cout << "  " << name << endl;}}return 0;
}

輸出:

匹配的文件名:report.txtlog_2025.lognotes.TXT

3、表單驗證:驗證郵箱、手機號、密碼強度

1. 郵箱驗證

string email = "test_user-123@example.co.uk";
regex email_pattern(R"([\w\.-]+@[\w\.-]+\.[a-zA-Z]{2,})");cout << (regex_match(email, email_pattern) ? "郵箱合法" : "郵箱非法") << endl;

2. 手機號驗證(中國大陸)

string phone = "13812345678";
regex phone_pattern(R"(1[3-9]\d{9})"); // 以1開頭 + 合法段位 + 9位數字cout << (regex_match(phone, phone_pattern) ? "手機號合法" : "手機號非法") << endl;

3. 密碼強度驗證(8~16位,包含字母和數字)

string password = "Abc12345";
regex pwd_pattern(R"((?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,16})");cout << (regex_match(password, pwd_pattern) ? "密碼合法" : "密碼不合法") << endl;

4、總結與推薦實踐

場景推薦正則
日志提取^\[ERROR\].* 或帶時間戳的模式
文件篩選`.*.(txtlog)$`
郵箱驗證[\w\.-]+@[\w\.-]+\.[a-zA-Z]{2,}
手機號驗證1[3-9]\d{9}
密碼驗證(?=.*[A-Za-z])(?=.*\d).{8,16}

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

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

相關文章

深入解析Avro、Protobuf與JSON:序列化技術的選擇與應用

在現代分布式系統和數據交換場景中&#xff0c;序列化技術是數據存儲、傳輸和通信的核心。本文深入探討三種主流序列化技術&#xff1a;Avro、Protobuf 和 JSON&#xff0c;從背景、特點、示例代碼&#xff08;Python&#xff09;、優勢及最佳實踐等多個維度進行對比分析&#…

Vue 中 effectScope() 的全面解析與實戰應用

一、effectScope 概述1.1 什么是 effectScopeeffectScope() 是 Vue 3.2 引入的核心 API&#xff0c;用于創建副作用作用域容器。它能夠將多個響應式副作用&#xff08;如 watch、watchEffect 和 computed&#xff09;組織在一起&#xff0c;實現統一的生命周期管理。1.2 核心價…

嵌入式面試八股文(十六)·一文搞懂嵌入式常用名詞IC、ASIC、CPU、MPU、MCU、SoC、SoPC、GPU、DSP

目錄 1. IC&#xff08;Integrated Circuit&#xff0c;集成電路&#xff09; 2. ASIC&#xff08;Application-Specific Integrated Circuit&#xff0c;專用集成電路&#xff09; 3. CPU&#xff08;Central Processing Unit&#xff0c;中央處理器&#xff09; 4. M…

安全參綉25暑假第一次作業

第一天 1.首先講了d0cker的部署&#xff0c; 這個是第一個Vulhub漏洞環境。所有環境都使用D0cker容器化&#xff0c;使其易于部署和隔離測試。 其中&#xff0c;國內的阿里用不了&#xff0c;你得搞個代理&#xff0c;下國外的&#xff1a;入門指南 | Vulhub 然后按這個…

RocketMQ源碼級實現原理-消息消費總覽

Overview可以看到&#xff0c;pull message和consume message實際上是兩個過程&#xff0c;但是對于用戶是透明的 注意這三個Offset的含義&#xff0c;physical offset就是commitLog中的全局偏移量分發dispatch如上圖&#xff0c;Topic的每個queue&#xff0c;都綁定了唯一的一…

linux打包固件shell腳本

不打包 pack.sh解壓后無父目錄&#xff08;直接是文件&#xff09;生成 checksum.txt&#xff08;包含所有文件的 SHA256&#xff09;打包后 .tar.gz 移動到上級目錄#!/bin/bash# 檢查是否傳入版本號參數 if [ -z "$1" ]; thenecho "Usage: $0 <version> …

用uniapp開發鴻蒙應用(暫停更新-根據項目更新,現在項目未開始)

1.根據博客生成.hap文件 【鴻蒙HarmonyOS開發技巧&#xff1a;如何不依賴華為商店直接安裝uniapp生成的app文件&#xff1f;一鍵轉換app至hap格式教程詳解】_entry-default-signed.hap-CSDN博客 根據網絡查詢鴻蒙手機安裝測試app&#xff0c;需要電腦命令安裝 在鴻蒙HarmonyOS手…

Linux 文件系統實現層詳解:原理、結構與驅動銜接

&#x1f4c2; Linux 文件系統實現層詳解&#xff1a;原理、結構與驅動銜接 &#x1f3ac; 推薦搭配視頻學習&#xff1a;Linux 文件系統子系統&#xff1a;三層架構全面掌握 一、為什么要重點理解文件系統實現層&#xff1f; 文件系統實現層是 Linux 文件系統的“地基”&…

區塊鏈應用場景深度解讀:金融領域的革新與突破

引言&#xff1a;區塊鏈技術的演進與金融領域的變革區塊鏈技術自2008年誕生以來&#xff0c;以其去中心化、不可篡改、可追溯等特性&#xff0c;在全球范圍內引發了金融領域的深刻變革。從最初的數字貨幣實驗&#xff0c;到如今在跨境支付、證券交易、供應鏈金融等領域的廣泛應…

redisson tryLock

應用場景RLock rLock redissonClient.getLock(Constant_LOCK request.getId()); try {boolean isLocked rLock.tryLock();if (!isLocked) {throw new ServiceException(ErrConstant.OPERATION_FAILED, "請勿重復提交");}源碼public interface RLock extends Lock,…

前端docx庫實現將html頁面導出word

前言&#xff1a;最近遇到一個需求&#xff0c;需要將頁面的html導出為word文檔&#xff0c;并且包含橫向和豎向頁面&#xff0c;并且可以進行混合方向導出。經過一段時間的實驗&#xff0c;發現只有docx這個庫滿足這個要求。在這里記錄一下實現思路以及代碼。 docx官網 一、…

虛擬主機CPU占用100導致打不開的一次處理

背景 突然有一天&#xff0c;有個客戶網站打不開了&#xff0c;發來這樣一張圖片問題排查 打開阿里云虛擬主機控制面板&#xff0c;CPU 使用率已經達到了100%&#xff0c;這說明網站已經在高負荷運轉。分析訪問日志發現&#xff0c;網站出現了大量循環路徑&#xff0c;其 UserA…

設計模式之工廠模式:對象創建的智慧之道

工廠模式&#xff1a;對象創建的智慧之道 引言&#xff1a;為什么我們需要工廠模式&#xff1f; 在軟件開發中&#xff0c;對象創建是最常見的操作之一。當代碼中充滿new關鍵字時&#xff0c;系統會面臨三大痛點&#xff1a; 緊耦合&#xff1a;客戶端代碼直接依賴具體實現類擴…

Docker鏡像制作案例

1、使用Docker commit制作鏡像為ubuntu鏡像提供ssh服務①&#xff1a;拉取鏡像[rootopenEuler-1 ~]# docker pull ubuntu:18.04②&#xff1a;啟動鏡像[rootopenEuler-1 ~]# docker run --name c1 -it --rm ubuntu:18.04 bash③&#xff1a;替換aliyun源mv /etc/apt/sources.li…

KeilMDK5如何生成.bin文件

1&#xff1a;主要是要找到fromelf.exe的路徑2&#xff1a;接下來要做的要視情況而定&#xff1a;選完fromelf.exe后在輸入框中加個空格然后加一串字 : --bin -o ./Obj/L.bin ./Obj/L.axf&#xff0c;如下我設置的L最終會替換成項目名 3&#xff1a;去構建生成編譯一下&#…

Ajax接收java后端傳遞的json對象包含長整型被截斷導致丟失精度的解決方案

問題描述 在使用java編寫代碼的時候,后端返回前端的JSON對象中包含了Long長整型,前端接受的時候丟失了精度問題。 比如: 后端傳遞的json {"code": "200","msg": "操作成功","data":

MybatisPlus由淺入深

MyBatis-Plus&#xff08;簡稱 MP&#xff09;是一個 MyBatis 的增強工具&#xff0c;旨在簡化開發過程。基本使用步驟1.依賴引入<!-- mysql依賴 --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>…

藍牙信號強度(RSSI)與鏈路質量(LQI)的測量與應用:面試高頻考點與真題解析

在藍牙通信領域&#xff0c;信號強度&#xff08;RSSI&#xff09;和鏈路質量&#xff08;LQI&#xff09;是評估無線鏈路性能的核心指標。無論是智能家居設備的連接優化&#xff0c;還是工業物聯網中的抗干擾設計&#xff0c;這兩個指標都扮演著關鍵角色。本文將結合面試高頻考…

PyTorch的計算圖是什么?為什么繪圖前要detach?

在PyTorch中&#xff0c;計算圖&#xff08;Computational Graph&#xff09; 是自動求導&#xff08;Autograd&#xff09;的核心機制。理解計算圖有助于解釋為什么在繪圖前需要使用 .detach() 方法分離張量。一、什么是計算圖&#xff1f; 計算圖是一種有向無環圖&#xff08…

深度學習入門代碼詳細注釋-ResNet18分類螞蟻蜜蜂

本項目將基于PyTorch平臺遷移ResNet18模型。該模型原采用ImageNet數據集&#xff08;含1000個圖像類別&#xff09;進行訓練。我們將嘗試運用該模型對螞蟻和蜜蜂進行分類&#xff08;這兩個類別未包含在原訓練數據集中&#xff09;。 本文的原始代碼參考于博客深度學習入門項目…