正則表達式(Regular Expression,簡稱 Regex)

一、5w2h(七問法)分析正則表達式

是的,5W2H 完全可以應用于研究 正則表達式(Regular Expressions)。通過回答 5W2H 的七個問題,我們可以全面理解正則表達式的定義、用途、使用方法、適用場景等,幫助我們更好地學習和掌握它。

1. What(什么是正則表達式?)

  • 正則表達式是一種用于描述字符串模式的語法規則。它通過一些特殊的字符和符號來定義匹配文本的模式,廣泛應用于文本搜索、替換、驗證等操作中。正則表達式能夠匹配符合特定規則的字符串。

例如:

  • \d:匹配任何數字字符。
  • ^abc:匹配以"abc"開頭的字符串。
  • \w+:匹配一個或多個字母、數字或下劃線。

2. Why(為什么要使用正則表達式?)

  • 正則表達式通過其簡潔的語法提供了一種強大的工具,可以在文本中進行復雜的模式匹配,減少繁瑣的文本處理代碼,提升開發效率。
  • 用途
    • 驗證輸入:比如驗證電子郵件地址、電話號碼等格式。
    • 查找和替換:在文本中查找符合某個模式的字符串并替換。
    • 文本提取:從文本中提取符合特定模式的信息。

3. When(何時使用正則表達式?)

  • 當你需要處理或驗證字符串的格式時,尤其是在文本搜索、數據清洗、日志分析等場景下,正則表達式非常有用。
  • 常見場景
    • 驗證用戶輸入(如郵箱、日期格式等)。
    • 提取特定格式的數據(如從網頁抓取郵箱地址、電話號碼等)。
    • 文本搜索和替換(如在代碼中查找函數定義或在文件中查找特定信息)。

4. Where(在哪里使用正則表達式?)

  • 正則表達式可以在許多編程語言和工具中使用,幾乎所有現代編程語言都支持正則表達式(如 Java, Python, JavaScript, C# 等)。
  • 應用場景
    • 編程語言:在 Python 中使用 re 模塊,在 JavaScript 中使用 RegExp 對象,在 Java 中使用 Pattern 類等。
    • 文本編輯器:許多文本編輯器(如 VS Code、Sublime Text)支持正則表達式來進行查找和替換。
    • 命令行工具:如 grep, sed, awk 等 Unix 工具支持正則表達式。

5. Who(誰使用正則表達式?)

  • 程序員:正則表達式是開發人員必備的工具,特別是涉及文本處理、數據清理、日志分析等任務時。
  • 測試人員:在自動化測試中,正則表達式可用于驗證字符串的格式或從響應中提取信息。
  • 數據分析師:用于清洗和提取結構化或非結構化數據中的有用信息。

6. How(如何使用正則表達式?)

  • 正則表達式的語法通常包括常用的特殊字符和元字符,如:
    • .:匹配任意單個字符。
    • *:匹配前面的字符零次或多次。
    • +:匹配前面的字符一次或多次。
    • []:定義字符集,匹配其中的任意一個字符。
    • |:表示"或"操作,匹配左邊或右邊的表達式。
    • ():分組,用來定義子表達式或捕獲匹配。
  • 使用方法
    • 在編程中,通常使用正則表達式的相關API進行匹配和操作。例如,在 Python 中:
import re
pattern = r'\d+'  # 匹配一個或多個數字
result = re.findall(pattern, 'There are 123 apples and 456 oranges.')
print(result)  # 輸出:['123', '456']

7. How much(多少?)

  • 正則表達式本身是一個計算機程序語言的工具,它沒有直接的“成本”,但它的復雜度和匹配的文本量可能會影響性能。尤其是在大型文本處理時,正則表達式的效率和匹配速度可能會成為問題。
  • 性能問題
    • 對于非常復雜的正則表達式,或者需要匹配大量文本的操作,可能會導致性能問題。因此在使用正則表達式時,需要謹慎設計,以避免過度復雜的匹配模式和低效的匹配操作。

總結:

通過使用 5W2H 方法來分析 正則表達式,可以幫助我們全面了解它的定義、目的、應用場景以及如何高效地使用它。在實際工作中,正則表達式是一個強大的工具,特別是在需要處理和分析字符串時,通過結構化思維,可以幫助我們更好地理解正則表達式的使用方式和最佳實踐。

二、正則表達式-菜鳥教程-整理

非打印字符

非打印字符也可以是正則表達式的組成部分。下表列出了表示非打印字符的轉義序列:

字符描述
\cx匹配由x指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 'c' 字符。
\f匹配一個換頁符。等價于 \x0c 和 \cL。
\n匹配一個換行符。等價于 \x0a 和 \cJ。
\r匹配一個回車符。等價于 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。注意 Unicode 正則表達式會匹配全角空格符。
\S匹配任何非空白字符。等價于 [^ \f\n\r\t\v]。
\t匹配一個制表符。等價于 \x09 和 \cI。
\v

匹配一個垂直制表符。等價于 \x0b 和 \cK。

特殊字符

所謂特殊字符,就是一些有特殊含義的字符,如上面說的?runoo*b?中的?*,簡單的說就是表示任何字符串的意思。如果要查找字符串中的?*?符號,則需要對?*?進行轉義,即在其前加一個?\,runo\*ob?匹配字符串?runo*ob

許多元字符要求在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使字符"轉義",即,將反斜杠字符\?放在它們前面。下表列出了正則表達式中的特殊字符:

特別字符描述
$匹配輸入字符串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,請使用 \$。
( )標記一個子表達式的開始和結束位置。子表達式可以獲取供以后使用。要匹配這些字符,請使用 \( 和 \)。
*匹配前面的子表達式零次或多次。要匹配 * 字符,請使用 \*。
+匹配前面的子表達式一次或多次。要匹配 + 字符,請使用 \+。
.匹配除換行符 \n 之外的任何單字符。要匹配 . ,請使用 \. 。
[標記一個中括號表達式的開始。要匹配 [,請使用 \[。
?匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 \?。
\將下一個字符標記為或特殊字符、或原義字符、或向后引用、或八進制轉義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("。
^匹配輸入字符串的開始位置,除非在方括號表達式中使用,當該符號在方括號表達式中使用時,表示不接受該方括號表達式中的字符集合。要匹配 ^ 字符本身,請使用 \^。
{標記限定符表達式的開始。要匹配 {,請使用 \{。
|指明兩項之間的一個選擇。要匹配 |,請使用 \|。

限定符

限定符用來指定正則表達式的一個給定組件必須要出現多少次才能滿足匹配。有?*?或?+?或???或?{n}?或?{n,}?或?{n,m}?共6種。

正則表達式的限定符有:

字符描述實例
*匹配前面的子表達式零次或多次。例如,zo*?能匹配?"z"?以及?"zoo"。*?等價于?{0,}。嘗試一下 ?
+匹配前面的子表達式一次或多次。例如,zo+?能匹配?"zo"?以及 "zoo",但不能匹配?"z"。+?等價于?{1,}。嘗試一下 ?
?

匹配前面的子表達式零次或一次。例如,do(es)??可以匹配?"do"?、?"does"、?"doxy"?中的?"do"?和?"does"。??等價于?{0,1}。

嘗試一下 ?
{n}n 是一個非負整數。匹配確定的?n?次。例如,o{2}?不能匹配?"Bob"?中的?o,但是能匹配?"food"?中的兩個?o嘗試一下 ?
{n,}n 是一個非負整數。至少匹配n 次。例如,o{2,}?不能匹配?"Bob"?中的?o,但能匹配?"foooood"?中的所有?o。o{1,}?等價于?o+。o{0,}?則等價于?o*。嘗試一下 ?
{n,m}m 和 n 均為非負整數,其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,o{1,3}?將匹配?"fooooood"?中的前三個?o。o{0,1}?等價于?o?。請注意在逗號和兩個數之間不能有空格。

*?和?+?限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的后面加上一個 ? 就可以實現非貪婪或最小匹配。

例如,您可能搜索 HTML 文檔,以查找在?h1?標簽內的內容。HTML 代碼如下:

<h1>RUNOOB-菜鳥教程</h1>

貪婪:下面的表達式匹配從開始小于符號 (<) 到關閉 h1 標記的大于符號 (>) 之間的所有內容。

/<.*>/

非貪婪:如果您只需要匹配開始和結束 h1 標簽,下面的非貪婪表達式只匹配 <h1>。

/<.*?>/

也可以使用以下正則表達式來匹配 h1 標簽,表達式則是:

/<\w+?>/

通過在?*、+?或???限定符之后放置??,該表達式從"貪婪"表達式轉換為"非貪婪"表達式或者最小匹配。

以下列出 ?=、?<=、?!、?<! 的使用區別

exp1(?=exp2):查找 exp2 前面的 exp1。

(?<=exp2)exp1:查找 exp2 后面的 exp1。

exp1(?!exp2):查找后面不是 exp2 的 exp1。

(?<!exp2)exp1:查找前面不是 exp2 的 exp1。

三、如何分析正則表達式-案例

你提供的正則表達式 ^[0-9]{1,}\.([^。|\r]*)[。|\r] 用于匹配以數字開頭、后跟句點(.),并以句號()或換行符(\r)結尾的字符串。以下是對該正則表達式的詳細解析:


1. 正則表達式解析

^[0-9]{1,}\.([^。|\r]*)[。|\r]
各部分含義:
  1. ^: 匹配字符串的開頭。
  2. [0-9]{1,}:
    • [0-9]: 匹配任意一個數字(0到9)。
    • {1,}: 表示前面的模式(數字)至少出現1次,可以出現多次。
    • 整體含義:匹配一個或多個數字。
  1. \.: 匹配一個句點(.)。由于句點在正則表達式中有特殊含義(匹配任意字符),因此需要用反斜杠(\)進行轉義。
  2. ([^。|\r]*):
    • [^。|\r]: 匹配不是句號()或換行符(\r)的任意字符。
    • *: 表示前面的模式(非句號或換行符)可以出現0次或多次。
    • 整體含義:匹配一段不包含句號或換行符的文本,并將其捕獲為一個分組。
  1. [。|\r]: 匹配一個句號()或換行符(\r),表示字符串的結束。

2. 匹配示例

假設有以下文本:

1.這是一個測試。
2.這是另一個測試
3.這是第三個測試。
匹配結果:
  1. 1.這是一個測試。:
    • 匹配內容:1.這是一個測試。
    • 捕獲的分組:這是一個測試
  1. 2.這是另一個測試:
    • 匹配內容:2.這是另一個測試
    • 捕獲的分組:這是另一個測試
  1. 3.這是第三個測試。:
    • 匹配內容:3.這是第三個測試。
    • 捕獲的分組:這是第三個測試

3. 改進建議

你的正則表達式已經可以滿足基本需求,但有一些地方可以優化:

  1. 字符集語法:
    • [^。|\r] 中的 | 是多余的,應該直接寫成 [^。\r]
    • 修正后:([^。\r]*)
  1. 換行符處理:
    • 如果需要匹配多種換行符(如 \n\r\n),可以將 \r 替換為 \r?\n
    • 修正后:[。\r?\n]
改進后的正則表達式:
^[0-9]{1,}\.([^。\r]*)[。\r?\n]

4. 總結

  • 原始正則表達式: ^[0-9]{1,}\.([^。|\r]*)[。|\r]
  • 功能: 匹配以數字開頭、后跟句點,并以句號或換行符結尾的字符串。
  • 優化建議: 修正字符集語法,并考慮多種換行符的情況。

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

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

相關文章

爬蟲獲取1688關鍵字搜索接口的實戰指南

在當今電商行業競爭激烈的環境下&#xff0c;數據的重要性不言而喻。1688作為國內領先的B2B電商平臺&#xff0c;擁有海量的商品信息&#xff0c;這些數據對于商家的市場分析、選品決策、價格策略制定等都有著重要的價值。本文將詳細介紹如何通過爬蟲技術獲取1688關鍵字搜索接口…

如何快速解決django存儲session變量時出現的django.db.utils.DatabaseError錯誤

我們在學習django進行web編程的時候&#xff0c;有時需要將一些全局變量信息存儲在session中&#xff0c;但使用過程中&#xff0c;卻發現會引起數據庫的報錯。通過查看django源碼信息&#xff0c;發現其對session信息進行了ORM映射&#xff0c;如果數據庫中不存在對應的表信息…

C語言復習--assert斷言

assert.h 頭?件定義了宏 assert() &#xff0c;?于在運?時確保程序符合指定條件&#xff0c;如果不符合&#xff0c;就報錯終止運行。這個宏常常被稱為“斷?”。 assert(p ! NULL); 代碼在程序運?到這??語句時&#xff0c;驗證變量 p 是否等于 NULL 。如果確實不等于 NU…

STL新增內容

文章目錄 C11 中的 STL 新增內容容器算法 C14 中的 STL 新增內容容器算法 C17 中的 STL 新增內容容器算法 C20 中的 STL 新增內容容器算法 C11 中的 STL 新增內容 容器 std::array&#xff1a;這是一個固定大小的數組容器&#xff0c;和原生數組類似&#xff0c;但具備更好的…

C#測試Excel開源組件ExcelDataReader

使用微軟的com組件Microsoft.office.Interop.Excel讀寫Excel文件雖然可用&#xff0c;但是列多、行多的時候速度很慢&#xff0c;之前測試過Sylvan.Data.Excel包的用法&#xff0c;如果只是讀取Excel文件內容的話&#xff0c;還可以使用ExcelDataReader包&#xff0c;后者是C#開…

位置編碼匯總 # 持續更新

看了那么多還沒有講特別好的&#xff0c;GPT老師講的不錯關于三角函數編碼。 一、 手撕transformer常用三角位置編碼 GPT說&#xff1a;“低維度的編碼&#xff08;例如&#xff0c;第一個維度&#xff09;可以捕捉到大的位置差異&#xff0c;而高維度的編碼則可以捕捉到小的細…

Java 模塊系統深度解析

Java 模塊系統深度解析 Java 模塊系統&#xff08;Java Platform Module System, JPMS&#xff09;是 Java 9 引入的一項重要特性&#xff0c;它從根本上改變了 Java 應用程序的打包和依賴管理方式。本文將全面介紹 Java 模塊系統的核心概念、優勢及實際應用。 一、為什么需要…

藍橋杯杯賽-日期模擬

知識點 處理日期 1. 按天枚舉日期&#xff1a;逐天遍歷起始日期到結束日期范圍內的每個日期。 2. 處理閏年&#xff1a;正確判斷閏年條件。閏年定義為&#xff1a;年份 滿足以下任意一個條件&#xff1a;(閏年的2月只有29天) 滿足下面一個條件就是閏年 1> 是 400 的倍數…

.Net中對稱加密的實現

常見對稱加密算法及優缺點 1. DES&#xff08;Data Encryption Standard&#xff09; 優點&#xff1a;是最早被廣泛應用的加密算法&#xff0c;算法公開&#xff0c;實現簡單&#xff0c;效率較高。缺點&#xff1a;密鑰長度較短&#xff08;56 位&#xff09;&#xff0c;在…

SQLMesh調度系統深度解析:內置調度與Airflow集成實踐

本文系統解析SQLMesh的兩種核心調度方案&#xff1a;內置調度器與Apache Airflow集成。通過對比兩者的適用場景、架構設計和操作流程&#xff0c;為企業構建可靠的數據分析流水線提供技術參考。重點內容包括&#xff1a; 內置調度器的輕量級部署與性能優化策略Airflow集成的端到…

centos線程數查看

查看當前最大支持的線程數 cat /proc/sys/kernel/threads-max當前用戶進程可以創建的最大線程數&#xff08;包括子進程&#xff09; [rootlocalhost tmp]# ulimit -u得到當前實際的線程數 [rootlocalhost tmp]# ps -eLf | wc -l統計每個進程的總線程數前20的數據 [rootloc…

【大模型】視覺語言模型:Qwen2.5-VL的使用

官方github地址&#xff1a;https://github.com/QwenLM/Qwen2.5-VL 目錄 Qwen家族的最新成員&#xff1a;Qwen2.5-VL 主要增強功能 模型架構更新 快速開始 使用Transformers聊天 Docker Qwen家族的最新成員&#xff1a;Qwen2.5-VL 主要增強功能 強大的文檔解析功能&am…

HDMI接口設計

1. HDMI簡介 HDMI(High Definition Multimedia Interface)高清多媒體接口,是首個支持在單線纜上傳輸,不經過壓縮的全數字高清晰度、多聲道音頻和智能格式與控制命令數據的數字接口。這個接口可以同時傳輸視頻信號、音頻信號和控制信號。 從上圖里面可以看到HDMI有3組數據信號…

C/C++ JSON 庫綜合對比及應用案例(六)

第六部分&#xff1a;C/C JSON 庫綜合對比及應用案例 &#x1f4e2; 快速掌握 JSON&#xff01;文章 視頻雙管齊下 &#x1f680; 如果你覺得閱讀文章太慢&#xff0c;或者更喜歡 邊看邊學 的方式&#xff0c;不妨直接觀看我錄制的 JSON 課程視頻&#xff01;&#x1f3ac; …

LXC 導入(Rockylinux,almalinux,oraclelunx,debian,ubuntu,openEuler,kail,opensuse)

前提要求 ubuntu下安裝lxd 參考Rockylinux下安裝lxd 參考LXC 源替換參考LXC 容器端口發布參考LXC webui 管理<

Spring MVC 頁面跳轉方案與區別

SpringMVC 的頁面跳轉方案主要分為 ?轉發&#xff08;Forward&#xff09;? 和 ?重定向&#xff08;Redirect&#xff09;? 兩類&#xff0c;具體實現方式和區別如下&#xff1a; 一、頁面跳轉方案 1. ?轉發&#xff08;Forward&#xff09;? 默認方式?&#xff1a;直…

基于Spring Boot的輕型卡車零部件銷售平臺的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

高性能計算面經

高性能計算面經 C八股文真景一面涼經自我介紹&#xff0c;介紹一下你做過的加速的模塊(疊噪&#xff0c;噪聲跟原圖有什么關系&#xff1f;)OpenGL和OpenCL有什么區別&#xff1f;**1. 核心用途****2. 編程模型****3. 硬件抽象****4. API設計****5. 典型應用場景****6. 互操作性…

青少年編程與數學 02-014 高中數學知識點 07課題、專業相關性分析

青少年編程與數學 02-014 高中數學知識點 07課題、專業相關性分析 一、函數與微積分1. 函數與初等函數2. 導數與優化 二、概率與統計1. 概率基礎2. 統計推斷3. 隨機變量與分布 三、幾何與代數1. 向量與矩陣運算2. 復數與坐標變換 四、數學建模與算法思維1. 數學建模2. 算法邏輯…

11亂碼問題的解釋(2)

這個字符串使用哪種方式編碼的?---看包含在哪個文件中 和當前 mylabel.cpp 文件的編碼方式是一致的~~ 如果這里顯示的是 UTF-8&#xff0c;說明這個文件就是UTF-8 編碼 如果顯示的是 ANSI,說明這個文件就是 GBK 編碼~ Qt Creator 內置的終端是 utf8 的方式來顯示字符串嗎?? …