正則表達式:文本處理的瑞士軍刀

正則表達式:文本處理的瑞士軍刀

正則表達式(Regular Expression,簡稱 Regex)是一種用于匹配、查找和操作文本的強大工具。它通過定義一種特殊的字符串模式,可以快速地在文本中搜索、替換或提取符合特定規則的內容。正則表達式廣泛應用于編程、文本編輯、數據處理等領域,是每個開發者必備的技能之一。


一、正則表達式的核心概念

1. 模式(Pattern)

正則表達式的核心是一個模式字符串,它定義了需要匹配的文本規則。例如:

  • \d 匹配任意數字(0-9)
  • [a-z] 匹配任意小寫字母
  • .* 匹配任意字符(除換行符外)

2. 匹配(Match)

在目標文本中查找符合模式的內容。例如:

  • 正則表達式 \d{3} 可以匹配文本中的任意連續3個數字(如 “123”)。

3. 捕獲組(Capture Group)

用括號 () 將部分模式括起來,可以提取匹配的子內容。例如:

  • 正則表達式 (\d{4})-(\d{2})-(\d{2}) 可以匹配日期格式 “2023-10-05”,并分別捕獲年、月、日。

二、正則表達式的語法規則

1. 基本元字符

元字符描述示例
.匹配任意單個字符(除換行符外)a.c 匹配 “abc”
\d匹配任意數字(0-9)\d{3} 匹配 “123”
\w匹配字母、數字或下劃線\w+ 匹配 “hello_123”
\s匹配空白字符(空格、制表符等)\s+ 匹配 " "

2. 量詞

量詞描述示例
*匹配前一個元素0次或多次a* 匹配 “”、“a”、“aa”
+匹配前一個元素1次或多次\d+ 匹配 “1”、“123”
?匹配前一個元素0次或1次a? 匹配 “”、“a”
{n}匹配前一個元素恰好n次\d{3} 匹配 “123”
{n,m}匹配前一個元素至少n次,至多m次\d{2,4} 匹配 “12”、“1234”

3. 字符類

語法描述示例
[abc]匹配括號內的任意一個字符[aeiou] 匹配 “a”、“e”
[^abc]匹配不在括號內的任意字符[^0-9] 匹配 “a”、“!”
[a-z]匹配范圍內的任意字符[A-Za-z] 匹配大寫或小寫字母

4. 邊界匹配

語法描述示例
^匹配字符串的開頭^Hello 匹配 “Hello world” 的開頭
$匹配字符串的結尾world$ 匹配 “Hello world” 的結尾
\b匹配單詞邊界\bcat\b 匹配 “cat” 但不匹配 “category”

三、正則表達式的應用場景

1. 數據驗證

  • 驗證郵箱格式:
    ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
    
  • 驗證手機號格式:
    ^1[3-9]\d{9}$
    

2. 文本搜索與替換

  • 查找所有日期:
    \d{4}-\d{2}-\d{2}
    
  • 替換HTML標簽:
    <[^>]+>
    

3. 數據提取

  • 提取URL中的域名:
    https?://([^/\s]+)
    
  • 提取文本中的所有數字:
    \d+
    

四、正則表達式的編程實現(C++示例)

C++11 引入了 <regex> 庫,支持正則表達式操作。以下是一個簡單的示例:

#include <iostream>
#include <regex>
#include <string>int main() {std::string text = "Contact us at support@example.com or sales@domain.com.";std::regex emailPattern(R"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b)");auto words_begin = std::sregex_iterator(text.begin(), text.end(), emailPattern);auto words_end = std::sregex_iterator();std::cout << "Found emails:\n";for (std::sregex_iterator i = words_begin; i != words_end; ++i) {std::smatch match = *i;std::cout << match.str() << '\n';}return 0;
}

輸出

Found emails:
support@example.com
sales@domain.com

五、正則表達式的性能優化

1. 避免貪婪匹配

  • 貪婪匹配(默認):
    <.*>
    
    匹配整個 <div>content</div>
  • 非貪婪匹配:
    <.*?>
    
    匹配 <div></div> 兩個標簽。

2. 預編譯正則表達式

在多次使用同一正則表達式時,預編譯可以顯著提高性能:

std::regex emailPattern(R"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b)");

3. 使用非捕獲組

如果不需要捕獲組的內容,使用 (?:...) 可以提高性能:

(?:\d{4})-(?:\d{2})-(?:\d{2})

六、正則表達式的學習資源

  1. 在線測試工具

    • Regex101
    • RegExr
  2. 經典書籍

    • 《精通正則表達式》(Jeffrey E.F. Friedl)
    • 《正則表達式必知必會》
  3. 練習平臺

    • LeetCode 正則表達式題目
    • HackerRank Regex Challenges

正則表達式是文本處理的利器,但也需要謹慎使用。掌握其核心語法和優化技巧,可以讓你在數據處理中事半功倍!

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

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

相關文章

SQL 中UPDATE 和 DELETE 語句的深入理解與應用

在 SQL 中&#xff0c;UPDATE和DELETE語句是用于操作表數據的重要工具&#xff0c;它們允許我們對已存在的數據進行修改和刪除。 一、UPDATE 語句 &#xff08;一&#xff09;基本語法 UPDATE語句的基本語法如下&#xff1a; UPDATE table_name SET column1 value1, colum…

C 語 言 --- 掃 雷 游 戲(初 階 版)

C 語 言 --- 掃 雷 游 戲 初 階 版 代 碼 全 貌 與 功 能 介 紹掃雷游戲的功能說明游 戲 效 果 展 示游 戲 代 碼 詳 解game.htest.cgame.c 總結 &#x1f4bb;作 者 簡 介&#xff1a;曾 與 你 一 樣 迷 茫&#xff0c;現 以 經 驗 助 你 入 門 C 語 言 &#x1f4a1;個 人 主…

車載以太網網絡測試-21【傳輸層-DOIP協議-4】

目錄 1 摘要2 DoIP entity status request/response&#xff08;0x4001、0x4002&#xff09;2.1 使用場景2.2 報文結構2.2.1 0x4001&#xff1a;DoIP entity status request2.2.2 0x4002&#xff1a;DoIP entity status response 3 Diagnostic power mode information request/…

CH347使用筆記:CH347結合STM32CubeIDE實現單片機下載與調試

目錄 基于 STM32CubeIDE的 CH347 JTAG/SWD調試器使用說明1. CH347驅動安裝與配置2. STM32CubeIDE調試器配置2.1 打開相關工程后&#xff0c;進行以下操作2.2 openocd.exe替換2.3 腳本添加2.4 更改調試器選擇 3. 下載程序4. 使用過程中可能遇到的問題4.1 CH347未插入4.2 Openocd…

LVGL常用功能備忘

概述 本文選用LVGL 8.3版本 8.3版本實測幀率比起9版本高,多個GUI工具支持 相關鏈接 LVGL官網 https://lvgl.io/ LVGL 文檔 https://docs.lvgl.io/8.3/ LVGL倉庫 https://github.com/lvgl LVGL移植 獲取源碼 https://github.com/lvgl/lvgl/tree/release/v8.3 下載文件即可 文件…

k8s搭建kube-prometheus

后續再補一個k8s集群搭建的博客&#xff0c;從0開始搭建k8s集群。使用kube-prometheus非常方便&#xff0c;主要問題只在于拉取鏡像。除了拉取鏡像外其他時間5分鐘即可。耐心等待拉取鏡像。 一.kube-prometheus簡介 kube-prometheus 是一個專為 Kubernetes 設計的開源監控解決…

uni-app——數據緩存API

數據緩存API 在 uni-app 開發中&#xff0c;數據緩存 API 起著重要作用&#xff0c;它能夠將需要的數據保存到本地&#xff0c;同時也提供了獲取本地緩存數據、移除緩存數據以及清理緩存數據的功能。在實際項目里&#xff0c;數據緩存 API 常被用于存儲會員登錄狀態信息、購物…

突破時空邊界:Java實時流處理中窗口操作與時間語義的深度重構

一、流處理范式的革命性演進 在數字化浪潮的推動下&#xff0c;數據處理范式正經歷著從批量到實時的根本性轉變。這種轉變不僅改變了數據處理的時效性特征&#xff0c;更重新定義了時間維度在計算模型中的戰略地位。Apache Flink的統計數據顯示&#xff0c;現代流處理系統每秒…

【2025 深圳大學-騰訊云程序設計競賽(熱身賽)】題解

比賽鏈接 A. Cloud Studio的共享連接 題目大意 && Solution 給定 T T T 組長度均為 12 12 12 的字符串 s s s。 對每個 s s s&#xff0c;將其按從左到右的順序兩兩分組形成 6 6 6 個 A S C I I \rm{ASCII} ASCII 碼&#xff0c;對這 6 6 6 個 A S C I I \…

APScheduler - 用戶指南

本文翻譯整理自&#xff1a;https://apscheduler.readthedocs.io/en/3.x/userguide.html 文章目錄 一、安裝 APScheduler二、代碼示例三、基本概念四、選擇合適的 scheduler, job store(s), executor(s) and trigger(s)五、配置調度器方法 1:方法 2:方法 3: 六、啟動調度器七、…

vue3:十一、主頁面布局(優化頁面跳轉方式)

:router"true" 一、參考文章 vue3:十一、主頁面布局(實現基本左側菜單右側內容效果)-CSDN博客 參考上述文章可知&#xff0c;頁面跳轉是通過在js中定義的菜單中攜帶的path&#xff0c;然后通過菜單的點擊事件完成的跳轉&#xff0c;現在可以進行優化&#xff0c;直…

每日一題--C與C++的差別

C與C的差別 1. 編程范式 C 純 過程式編程語言&#xff0c;強調函數和結構化編程。 代碼通過函數和順序步驟組織&#xff0c;適合底層系統開發。 C 支持 多范式編程&#xff1a; 過程式編程 面向對象編程&#xff08;OOP&#xff09;&#xff08;類、繼承、多態&#xff09; …

Etcd 服務搭建

&#x1f4a2;歡迎來到張胤塵的開源技術站 &#x1f4a5;開源如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 Etcd 服務搭建預編譯的二進制文件安裝下載 etcd 的…

玩轉C#函數:參數、返回值與游戲中的攻擊邏輯封裝

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

WebRTC建立Description的通信的實際的原理

一、正確流程的核心邏輯 // 發送端正確代碼示例 const senderPC new RTCPeerConnection();// 生成Offer時立即開始收集候選 ? senderPC.createOffer().then(offer > {await senderPC.setLocalDescription(offer); // 觸發icecandidate事件sendToReceiver(offer); });// …

EmbodiedSAM:在線實時3D實例分割,利用視覺基礎模型實現高效場景理解

2025-02-12&#xff0c;由清華大學和南洋理工大學的研究團隊開發 一種名為 EmbodiedSAM&#xff08;ESAM&#xff09;的在線3D實例分割框架。該框架利用2D視覺基礎模型輔助實時3D場景理解&#xff0c;解決了高質量3D數據稀缺的難題&#xff0c;為機器人導航、操作等任務提供了高…

信創-人大金倉數據庫創建

一. 官文 資源下載地址 https://download.kingbase.com.cn/xzzx/index.htm 下載安裝文件 下載授權文件 產品文檔地址&#xff1a;https://help.kingbase.com.cn/v8/index.html 二. 概念 2.1 體系結構 ? 實例結構 ?&#xff1a;由數據庫文件和 KingbaseES 實例組成。數據…

C++第三種異質集合 std::any方式實現

#include <type_traits> #include <any> #include <functional> #include <iomanip> #include <iostream> #include <typeindex> #include <typeinfo> #include <unordered_map> #include <vector> //any是編譯期的異質…

Springboot實現使用斷點續傳優化同步導入Excel

springboot實現使用斷點續傳優化同步導入Excel 需求前言斷點續傳前端實現后端實現完結撒花&#xff0c;如有需要收藏的看官&#xff0c;順便也用發財的小手點點贊哈&#xff0c;如有錯漏&#xff0c;也歡迎各位在評論區評論&#xff01; 需求前言 在跨境電商系統中&#xff0c…

mysql 對json的處理?

MySQL從5.7版本開始支持JSON數據類型&#xff0c;并提供了多種函數來查詢和處理JSON數據。以下是一些基本的操作和函數&#xff1a; 創建包含JSON列的表&#xff1a; 可以直接在表定義中指定某列為JSON類型。 CREATE TABLE my_table (id INT NOT NULL AUTO_INCREMENT,data JSON…