正則表達式學習詳解

正則表達式

正則表達式(Regular Expression),通常簡稱為正則或正則表達式,是一種用于描述字符串模式的工具。它是由一系列字符和特殊字符組成的字符串,用于定義搜索模式或進行字符串匹配、替換、提取等操作。

正則表達式提供了一種靈活、強大且通用的方式來處理文本。它可以用于各種編程語言和文本編輯器中,例如Python、Java、JavaScript等,幾乎所有語言很多場景都可以用到正則表達式。

使用正則表達式,可以進行以下操作:

  • 匹配:檢查一個字符串是否與指定的模式匹配。
  • 搜索:在一個字符串中搜索滿足指定模式的內容。
  • 替換:將字符串中滿足指定模式的部分替換為其他內容。
  • 提取:從一個字符串中提取出滿足指定模式的內容。

正則表達式使用一些特殊字符和語法來表示不同的匹配規則,例如:

  • 字符匹配:使用普通字符表示匹配該字符本身。
  • 字符類:使用方括號 [] 表示匹配指定范圍內的字符。
  • 量詞:使用特殊字符表示匹配字符出現的次數,如 *、+、?、{}。
  • 邊界匹配:使用特殊字符表示匹配字符串的邊界或位置,如 ^、$、\b。
  • 分組:使用圓括號 () 表示將一組字符作為一個單元進行匹配或提取。

正則表達式的語法和特性因不同的實現和工具而略有差異,但基本的概念和常用的模式匹配規則是通用的。

學習工具推薦:

下載與安裝

你可以使用以下兩種方式中的任意一個來下載安裝正則表達式測試器,這個工具源文本內容不能輸入太多,要么有時候會匹配不成功。

  • 安裝版
    1. 下載 Regester安裝程序
    2. 解壓后運行 RegesterSetup.zh.exe
  • 綠色版
    1. 下載 Regester
    2. 解壓后運行 Regester.exe
    3. 如果無法啟動,請自行下載安裝 Microsoft .Net Framework 4.8 后再試

常見正則表達式命令和參數解釋:

  1. .(點號):匹配除換行符外的任意字符。

    • 示例:a.b 可以匹配 “aab”、“acb”、“adb” 等,但不匹配 “a\nb”。
  2. *:匹配前面的字符零次或多次。

    • 示例:ab*c 可以匹配 “ac”、“abc”、“abbc” 等。
  3. +:匹配前面的字符一次或多次。

    • 示例:ab+c 可以匹配 “abc”、“abbc” 等,但不匹配 “ac”。
  4. ?:匹配前面的字符零次或一次。

    • 示例:ab?c 可以匹配 “ac”、“abc”,但不匹配 “abbc”。
  5. [](字符類):匹配方括號內的任意字符。

    • 示例:[abc] 可以匹配 “a”、“b”、“c” 中的任意一個字符。
  6. [^](否定字符類):匹配不在方括號內的任意字符。

    • 示例:[^abc] 可以匹配除了 “a”、“b”、“c” 以外的任意字符。
  7. \d:匹配任意數字字符(0-9)。

    • 示例:\d+ 可以匹配一個或多個數字字符。
  8. \w:匹配任意字母、數字或下劃線字符。

    • 示例:\w+ 可以匹配一個或多個字母、數字或下劃線字符。
  9. \s:匹配任意空白字符(空格、制表符、換行符等)。

    • 示例:\s+ 可以匹配一個或多個空白字符。
  10. ^:匹配字符串的開頭。

    • 示例:^abc 可以匹配以 “abc” 開頭的字符串。
  11. $:匹配字符串的結尾。

    • 示例:abc$ 可以匹配以 “abc” 結尾的字符串。
  12. ()(分組):將字符組合成一個單元,可以對其進行操作。

    • 示例:(ab)+ 可以匹配 “ab”、“abab”、“ababab” 等。

零寬斷言匹配示例:

零寬斷言(Zero-width assertions)是正則表達式中的一種特殊語法,用于在匹配過程中對位置進行條件限制,而不匹配實際的字符。它們被稱為零寬度斷言,因為它們不會消耗字符串中的字符,僅用于確定匹配發生的位置。

零寬斷言分為正向斷言(Lookahead)和負向斷言(Lookbehind)兩種類型。正向斷言用于指定位置后面的條件,負向斷言用于指定位置前面的條件。

  1. 正向肯定預查(Positive Lookahead):

    • (?=abc):匹配后面緊跟著 “abc” 的位置。
    • 示例:a(?=bc) 可以匹配 “a”,但只有在后面跟著 “bc” 的情況下才匹配成功。
  2. 正向否定預查(Negative Lookahead):

    • (?!abc):匹配后面不緊跟著 “abc” 的位置。
    • 示例:a(?!bc) 可以匹配 “a”,但只有在后面不跟著 “bc” 的情況下才匹配成功。
  3. 負向肯定預查(Positive Lookbehind):

    • (?<=abc):匹配前面緊跟著 “abc” 的位置。
    • 示例:(?<=ab)c 可以匹配 “c”,但只有在前面緊跟著 “ab” 的情況下才匹配成功。
  4. 負向否定預查(Negative Lookbehind):

    • (?<!abc):匹配前面不緊跟著 “abc” 的位置。
    • 示例:(?<!ab)c 可以匹配 “c”,但只有在前面不跟著 “ab” 的情況下才匹配成功。

貪婪匹配非貪婪匹配

貪婪匹配(Greedy matching)和非貪婪匹配(Non-greedy matching)是正則表達式中量詞(匹配內容多還是少)的匹配模式。

貪婪匹配

是指在滿足匹配條件的前提下,盡可能多地匹配字符。它會盡量擴展匹配的范圍,直到無法再匹配為止。貪婪匹配使用量詞 +*{n,} 等,默認情況下都是貪婪匹配

例如:正則表達式 a+ 會盡量匹配連續重復的字符 “a”,直到遇到不是 “a” 的字符為止。

非貪婪匹配

是指在滿足匹配條件的前提下,盡可能少地匹配字符。它會盡量縮小匹配的范圍,以便允許后續的匹配得到滿足。非貪婪匹配使用量詞后面添加 ? 來表示。例如,正則表達式 a+? 會匹配盡可能少的連續重復的字符 “a”,以滿足匹配的條件。

通過比較貪婪匹配和非貪婪匹配,可以更好地控制正則表達式的匹配行為。貪婪匹配通常用于盡可能多地捕獲匹配的內容,而非貪婪匹配通常用于盡可能少地匹配,特別是在需要處理嵌套結構或提取特定部分的情況下非常有用。

貪婪匹配示例:

正則表達式:[a-z]+
輸入字符串:abcdefg
匹配結果:abcdefg
解釋:貪婪匹配會盡可能多地匹配小寫字母。在這個示例中,正則表達式 [a-z]+ 匹配了整個字符串 abcdefg,因為它可以匹配一個或多個連續的小寫字母。
非貪婪匹配示例:

正則表達式:[a-z]+?
輸入字符串:abcdefg
匹配結果:a
解釋:非貪婪匹配使用 ? 后綴來指示盡可能少地匹配小寫字母。在這個示例中,正則表達式 [a-z]+? 只匹配了第一個小寫字母 “a”,因為它盡可能少地匹配滿足條件的字符。
貪婪匹配和非貪婪匹配的比較:

正則表達式:“.+”
輸入字符串:“Hello” “World”
匹配結果(貪婪匹配):“Hello” “World”
匹配結果(非貪婪匹配):“Hello”
解釋:貪婪匹配會盡可能多地匹配字符,因此 “.+” 會匹配整個字符串 “Hello” “World”。而非貪婪匹配則盡可能少地匹配字符,因此 “.+?” 只匹配了第一個字符串 “Hello”。
貪婪匹配和非貪婪匹配的比較:

正則表達式:[0-9]+
輸入字符串:12345
匹配結果(貪婪匹配):12345
匹配結果(非貪婪匹配):12345
解釋:無論是貪婪匹配還是非貪婪匹配,正則表達式 [0-9]+ 都會匹配整個字符串 12345,因為它可以匹配一個或多個連續的數字。

正則表達式練習題:

  1. 匹配郵箱地址:
    正則表達式:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
    示例輸入:example@example.com

^:表示匹配字符串的開頭。

\w+:表示匹配一個或多個字母、數字或下劃線,這部分匹配了郵箱地址的用戶名部分。

([-+.]\w+)*:表示匹配一個連字符、加號或句點后跟一個或多個字母、數字或下劃線的組合,這部分匹配了用戶名中的特殊字符及后續字符,可以重復零次或多次。

@:表示匹配郵箱地址中的@

\w+:表示匹配一個或多個字母、數字或下劃線,這部分匹配了郵箱地址的域名中的名稱部分。

([-.]\w+)*:表示匹配一個連字符或句點后跟一個或多個字母、數字或下劃線的組合,這部分匹配了域名中的特殊字符及后續字符,可以重復零次或多次。
.:表示匹配郵箱地址中的點號(.),需要使用反斜杠進行轉義。

\w+:表示匹配一個或多個字母、數字或下劃線,這部分匹配了郵箱地址中的頂級域名部分。

([-.]\w+)*:表示匹配一個連字符或句點后跟一個或多個字母、數字或下劃線的組合,這部分匹配了頂級域名中的特殊字符及后續字符,可以重復零次或多次。
$:表示匹配字符串的結尾。

  1. 匹配手機號碼(簡化版):
    正則表達式:^\d{11}$
    示例輸入:12345678901

^:表示匹配字符串的開頭。
\d:表示匹配一個數字。
{11}:表示前面的元素(即數字)必須連續重復11次。
$:表示匹配字符串的結尾。

  1. 匹配日期(格式為YYYY-MM-DD):
    正則表達式:^\d{4}-\d{2}-\d{2}$
    示例輸入:2023-08-09

^:表示匹配字符串的開頭。
\d:表示匹配一個數字。
{4}:表示前面的元素(即數字)必須連續重復4次,即匹配4位數字的年份。
-:表示匹配連字符。
\d{2}:表示前面的元素(即數字)必須連續重復2次,即匹配2位數字的月份。
-:表示匹配連字符。
\d{2}:表示前面的元素(即數字)必須連續重復2次,即匹配2位數字的日期。
$:表示匹配字符串的結尾。

  1. 匹配URL(以http或https開頭):
    正則表達式:^(http|https)://[^\s/$.?#].[^\s]*$
    示例輸入:https://www.example.com

^:表示匹配字符串的開頭。
(http|https):使用括號和豎線(|)表示分組,表示匹配 http 或 https。
😕/:表示匹配 😕/ 字符串。
[^\s/$.?#]:表示匹配任意不是空白字符、斜杠、問號、點號或井號的字符。
.:表示匹配一個任意字符。
[^\s]*:表示匹配零個或多個任意不是空白字符的字符。
$:表示匹配字符串的結尾。

  1. 匹配整數(包括正負整數):
    正則表達式:^-?\d+$
    示例輸入:-123

^:表示匹配字符串的開頭。
-?:表示匹配可選的負號(減號)。- 表示匹配一個負號,? 表示前面的元素(即負號)可選。
\d+:表示匹配一個或多個數字。
$:表示匹配字符串的結尾。

  1. 匹配英文句子(以句號結尾):
    正則表達式:^[A-Z][^.!?]*\.$
    示例輸入:This is a sentence.

^:表示匹配字符串的開頭。
[A-Z]:表示匹配一個大寫字母。
[^.!?]*:表示匹配零個或多個非句號、非問號和非感嘆號的字符。這個部分用于匹配句子中除了句號以外的其他內容。
.:表示匹配句號。需要使用反斜杠進行轉義,因為句號在正則表達式中是一個特殊字符。
$:表示匹配字符串的結尾。

  1. 匹配HTML標簽(包括屬性):
    正則表達式:<([a-z]+)(\s[a-z]+\s*=\s*"[^"]*")*\s*>.*<\/\1>$
    示例輸入:<div class="example">This is a div.</div>
    匹配結果:匹配成功

<([a-z]+):表示匹配以 < 開始的標簽,并捕獲標簽名。 [a-z]+ 表示匹配一個或多個小寫字母。
(\s[a-z]+\s*=\s*"[^"]*")*:表示匹配零個或多個屬性,每個屬性由一個或多個小寫字母組成的屬性名、可選的空白字符、等號、可選的空白字符、以及由雙引號包圍的屬性值組成。這部分用于匹配標簽中的屬性。
\s*>:表示匹配以空白字符結尾并以 > 結束的標簽起始部分。
.*:表示匹配零個或多個任意字符,用于匹配標簽內的內容。
</\1>:表示匹配以 </ 開始、后跟與起始標簽相同的標簽名、以 > 結束的結束標簽。 \1 表示引用第一個捕獲組中的標簽名。

  1. 匹配IP地址(簡易版):
    正則表達式:^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$
    示例輸入:192.168.0.1
    匹配結果:匹配成功

^:表示匹配字符串的開頭。
\d{1,3}:表示匹配一個由 1 到 3 位數字組成的部分。
.:表示匹配一個點號(.)。需要使用反斜杠進行轉義,因為點號在正則表達式中是一個特殊字符。
.:表示匹配任意字符。
$:表示匹配字符串的結尾。

  1. 匹配郵政編碼(6位數字):
    正則表達式:^\d{6}$
    示例輸入:123456
    匹配結果:匹配成功

^:表示匹配字符串的開頭。
\d{6}:表示匹配六個連續的數字。
\d:表示匹配一個數字。
{6}:表示前面的元素(即數字)重復出現六次。
$:表示匹配字符串的結尾。

  1. 匹配用戶名(由字母、數字、下劃線組成,長度為4-16位):
    正則表達式:^[a-zA-Z0-9_]{4,16}$
    示例輸入:user_123
    匹配結果:匹配成功

^:表示匹配字符串的開頭。
[a-zA-Z0-9_]:表示匹配一個字母(大小寫)、數字或下劃線字符。
{4,16}:表示前面的元素(即字母、數字或下劃線)重復出現 4 到 16 次,限制了字符串的長度范圍。
$:表示匹配字符串的結尾。

我們為什么需要學習正則表達式:

  1. 文本處理和搜索: 正則表達式是一種強大的工具,可用于在文本中進行搜索、匹配、替換和提取操作。它們可以幫助你快速有效地處理和操縱文本數據。

  2. 模式匹配和驗證: 正則表達式是用于匹配和驗證特定模式的工具。你可以使用它們來驗證輸入數據的格式、匹配特定模式的字符串,例如郵箱地址、URL、電話號碼等。

  3. 編程和腳本語言支持: 正則表達式在許多編程語言和腳本語言中都有廣泛的支持,包括 Python、JavaScript、Java、C#等。了解正則表達式可以幫助你在編程中更好地處理字符串操作。

  4. 文本編輯器和IDE: 許多文本編輯器和集成開發環境(IDE)都支持正則表達式搜索和替換功能。掌握正則表達式可以提高你在編碼和文本編輯過程中的效率。

  5. 數據清洗和提取: 在數據處理和清洗過程中,正則表達式可以幫助你快速提取、篩選和轉換數據。它們特別適用于處理大量文本數據或具有特定格式的數據。

  6. 網絡爬蟲和數據抓取: 當你需要從網頁或其他來源中抓取數據時,正則表達式可以幫助你定位和提取所需的信息。它們是構建簡單的網絡爬蟲和數據抓取工具的有用工具。

學習正則表達式可以提升你在文本處理、模式匹配、數據清洗和編程方面的技能。它們是處理和操作文本的強大工具,廣泛應用于軟件開發、數據分析、文本處理等領域。掌握正則表達式將為你提供更多的靈活性和能力來處理和操作各種類型的文本數據。

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

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

相關文章

2024軟考系統架構設計師論文寫作要點

一、寫作注意事項 系統架構設計師的論文題目對于考生來說&#xff0c;是相對較難的題目。一方面&#xff0c;考生需要掌握論文題目中的系統架構設計的專業知識;另一方面&#xff0c;論文的撰寫需要結合考生自身的項目經歷。因此&#xff0c;如何將自己的項目經歷和專業知識有機…

SQL server中substring 的用法

一&#xff1a;substring函數是SQL中截取字段數據中的其中一部分 --列&#xff1a;提取abdcsef中的abc數據&#xff0c;使用substring實現select substring(abdcsef,1,3) --‘1’表示截取的起始位置是從第一個字符開始,‘3’表示截取后得到的字符串長度為3個字符 二&#xff1…

React源碼解析18(7)------ 實現事件機制(onClick事件)

摘要 在上一篇中&#xff0c;我們實現了useState的hook&#xff0c;但由于沒有實現事件機制&#xff0c;所以我們只能將setState掛載在window上。 而這一篇主要就是來實現事件系統&#xff0c;從而實現通過點擊事件進行setState。 而在React中&#xff0c;雖然我們是將事件綁…

前后端分離------后端創建筆記(07)表單驗證

1、我輸入數據&#xff0c;然后關閉&#xff0c;重新打開會發現殘存的數據仍然保留著 2、點了這個x號&#xff0c;數據就全部被清理了 3、點這三個地方&#xff0c;數據全部都清理掉 4、這里先寫一個方法 4.1 定義一個方法 4.2 這里表單的數據在哪里&#xff0c;就是這個 4.3 …

在 Linux 中使用 cp 命令

cp 命令是 Linux 中一個重要的命令&#xff0c;你可能經常會用到它。 正如名稱所示&#xff0c;cp 代表 復制copy&#xff0c;它被用于 在 Linux 命令行中復制文件和目錄。 這是一個相對簡單的命令&#xff0c;只有幾個選項&#xff0c;但你仍有必要深入了解它。 在展示 cp …

VLLM推理流程梳理

0x0. 前言 本文在對VLLM進行解析時只關注單卡情況&#xff0c;忽略基于ray做分布式推理的所有代碼。 0x1. 運行流程梳理 先從使用VLLM調用opt-125M模型進行推理的腳本看起&#xff1a; from vllm import LLM, SamplingParams# Sample prompts. prompts ["Hello, my n…

二次封裝element-plus上傳組件,提供校驗、回顯等功能

二次封裝element-plus上傳組件 0 相關介紹1 效果展示2 組件主體3 視頻組件4 Demo 0 相關介紹 基于element-plus框架&#xff0c;視頻播放器使用西瓜視頻播放器組件 相關能力 提供圖片、音頻、視頻的預覽功能提供是否為空、文件類型、文件大小、文件數量、圖片寬高校驗提供圖片…

el-table實現懶加載(el-table-infinite-scroll)

2023.8.15今天我學習了用el-table對大量的數據進行懶加載。 效果如下&#xff1a; 1.首先安裝&#xff1a; npm install --save el-table-infinite-scroll2 2.全局引入&#xff1a; import ElTableInfiniteScroll from "el-table-infinite-scroll";// 懶加載 V…

clion2020.3配置clang-format

標題clion 啟用clang-format 文件->設置->編輯器->代碼樣式. 為了保持原有代碼風格不變&#xff0c;可以把原始的配置風格先導出&#xff0c;最好直接保存到自己的工程下&#xff0c;.clang-format是隱藏文件&#xff0c;需要用ctrlH才能看到 文件->設置->編輯…

SpringBoot復習:(45)@Component定義的bean會被@Bean定義的同名的bean覆蓋

有同名的bean需要配置&#xff1a; spring.main.allow-bean-definition-overridingtrue 否則報錯。 package cn.edu.tju.component;import org.springframework.stereotype.Component;Component public class Person {private String name;private int age;{this.name "…

室溫超導是什么?有哪些應用場景?

目錄 一、應用場景&#xff1a;二、案例分析&#xff1a; 室溫超導是指在室溫下&#xff08;即約 20C 至 30C&#xff09;實現超導現象的材料。超導是指某些材料在低溫下電阻為零的物理現象&#xff0c;室溫超導材料是超導材料的一種。室溫超導現象的發現和研究是超導領域的一個…

ChatGPT在智能游戲和游戲AI中的應用如何?

ChatGPT在智能游戲和游戲AI領域具有廣泛的應用潛力&#xff0c;可以為游戲體驗增添智能和交互性&#xff0c;同時也有助于游戲開發者創造更豐富、更引人入勝的游戲內容。以下將詳細探討ChatGPT在智能游戲和游戲AI中的應用。 ## 1. 游戲角色的智能化 在角色扮演游戲&#xff0…

103.216.154.X服務器出現漏洞了有什么辦法?

服務器出現漏洞是一種嚴重的安全風險&#xff0c;需要及時采取措施來應對。以下是一些常見的應對措施&#xff1a; 及時更新補丁&#xff1a;確保服務器上的操作系統、應用程序和軟件都是最新版本&#xff0c;并及時應用相關的安全補丁&#xff0c;以修復已知的漏洞。 強化訪問…

OpenHarmony Meetup 廣州站 OpenHarmony正當時—技術開源

招募令 OpenHarmony Meetup 廣州站 火熱招募中&#xff0c;等待激情四射的開發者&#xff0c;線下參與OpenHarmonyMeetup線下交流 展示前沿技術、探討未來可能、讓你了解更多專屬OpenHarmony的魅力 線下參與&#xff0c;先到先得,僅限20個名額&#xff01; 報名截止時間8月23日…

【云原生】Docker 詳解(三):Docker 鏡像管理基礎

Docker 詳解&#xff08;三&#xff09;&#xff1a;Docker 鏡像管理基礎 1.鏡像的概念 鏡像可以理解為應用程序的集裝箱&#xff0c;而 Docker 用來裝卸集裝箱。 Docker 鏡像含有啟動容器所需要的文件系統及其內容&#xff0c;因此&#xff0c;其用于創建并啟動容器。 Dock…

-L和-rpath-link和-rpath

知識點 現代連接器在處理動態庫時將鏈接時路徑&#xff08;Link-time path&#xff09;和運行時路徑&#xff08;Run-time path&#xff09;分開,用戶可以通過-L指定連接時庫的路徑&#xff0c;通過-R&#xff08;或-rpath&#xff09;指定程序運行時庫的路徑&#xff0c;大大提…

Go學習-Day1

Go學習-Day1 個人博客&#xff1a;CSDN博客 打卡。 Go語言的核心開發團隊&#xff1a; Ken Thompson (C語言&#xff0c;B語言&#xff0c;Unix的發明者&#xff0c;牛人)Rob Pike(UTF-8發明人)Robert Griesemer(協助HotSpot編譯器&#xff0c;Js引擎V8) Go語言有靜態語言的…

MongoDB安裝

文章目錄 MongoDB安裝設置yum源安裝指定版本的mongodb配置文件連接MongoDB的工具MongoDBCompass MongoDB安裝 設置yum源 [rootWDQCVM sbin]# vim /etc/yum.repos.d/mongodb-org-6.0.repo [mongodb-org-6.0] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/red…

文件預覽/下載方式:通過二進制流(Blob)下載、或者通過文件Url下載

一、 通過二進制流&#xff08;Blob&#xff09;下載 1 、API請求時候帶上類型 /*** 文件--下載* */ export function download(fphm) {return axios({url: "/ynpst/download-invoice?fphm" fphm,method: get,responseType: blob}) }2、文件預覽和下載 /*** 預覽…

JavaScript如何執行語句

目錄 語法/詞法分析 預編譯 解釋執行 預編譯什么時候發生 js運行三步曲 預編譯前奏 預編譯步驟 鞏固基礎練習 語法/詞法分析 按語句塊的粒度解析成抽象語法樹 ,分析該js腳本代碼塊的語法是否正確&#xff0c;如果出現不正確&#xff0c;則向外拋出一個語法錯誤&#x…