Linux 正則表達式詳解(基礎 + 擴展 + 實操)

Linux 正則表達式詳解(基礎 + 擴展 + 實操)

正則表達式(Regular Expression,簡稱 RE)是 Linux 文本處理的核心工具,用于定義字符匹配模式,配合 grepsedawk 等工具可實現文本過濾、查找、替換等操作。本文將從概念、基礎正則、擴展正則、特殊字符組四個維度,結合實操案例完整講解

一、正則表達式概述

1. 核心概念

正則表達式是模式模板,Linux 工具通過該模板對數據流進行 “匹配篩選”:

  • 匹配的數據:被工具接受并進一步處理(如輸出、替換)
  • 不匹配的數據:被直接濾除

本質:通過 “普通字符 + 元字符” 的組合,描述字符串的排列規則,實現對文本的分割、匹配、查找、替換

2. 構成與作用

構成部分說明示例
普通字符無特殊含義的字符(字母、數字、標點)a1!-
元字符具有特殊匹配規則的專用字符^$*[ ]

核心作用:判斷字符串是否符合指定格式(如 “是否為手機號”“是否為郵箱”),或從文本中提取特定格式的內容(如 “提取所有 IP 地址”)

3. 可實現的核心目標

  1. 匹配驗證:判斷字符串是否符合正則模式(如 “驗證一行文本是否以 # 開頭”)
  2. 內容提取:從復雜文本中篩選出符合模式的部分(如 “從日志中提取所有錯誤代碼”)

二、基礎正則(Basic Regular Expression,BRE)

基礎正則是正則的 “核心子集”,支持 grepsed(基礎模式)、awk 等工具,核心是掌握元字符的匹配規則

1. 基礎正則核心元字符表

元字符功能描述示例匹配效果
\轉義字符:將特殊字符還原為普通字符\$\!\n匹配 $!、換行符
^匹配 “字符串開頭” 的位置^a^#匹配以 a 開頭、以 # 開頭的行
$匹配 “字符串結尾” 的位置word$3$匹配以 word 結尾、以 3 結尾的行
^$匹配 “空行”(開頭到結尾無任何字符)grep "^$" file.txt篩選文件中的所有空行
.匹配 “除換行符(\n)外的任意 1 個字符”lo.kl..kloak(1 個字符)、look(2 個字符)
*匹配 “前面 1 個字符出現 0 次或多次”lo*klk(o 出現 0 次)、lok(o1 次)、look(o2 次)
[list]匹配 “list 列表中的任意 1 個字符”go[ola]d[a-z0-9]gold/goal/god、任意小寫字母或數字
[^list]匹配 “非 list 列表中的任意 1 個字符”[^0-9][^a-z]非數字、非小寫字母
\{n\}匹配 “前面 1 個字符出現恰好 n 次lo\{2\}k[0-9]\{2\}look(o2 次)、任意 2 位數字
\{n,\}匹配 “前面 1 個字符出現至少 n 次lo\{2,\}k[0-9]\{3,\}look(o2 次)、loook(o3 次)、3 位及以上數字
\{n,m\}匹配 “前面 1 個字符出現n~m 次lo\{2,3\}klook(o2 次)、loook(o3 次)

注意:基礎正則中,{n}/{n,}/{n,m} 必須加轉義符 \,否則會被當作普通字符處理

2. 基礎正則實操案例

以下案例基于測試文件 a.txt/b.txt/c.txt,先定義測試文件內容:

[root@syf ~]# vim a.txt
lk
lok
look
loook
looooook
loooooaaak
looooooook
abbbbcd
abbbbcd666
ooooloooook
oooooolk
aoblck
~ 
[root@syf ~]# vim b.txt
aaabd
cdd
cdc
cdd
~ 
[root@syf ~]# vim c.txt
lok
lo12k
lo1k
loAk
loBk
look
loak
lodk
abcd
1234
~   
案例 1:* 匹配 “前面字符 0 次或多次”
# 匹配 "lo*k":o出現0次(lk)、1次(lok)、多次(look等)
[root@syf ~]# grep "lo*k" a.txt
lk          # o出現0次
lok         # o出現1次
look        # o出現2次
loook       # o出現3次
looooook    # o出現5次
looooooook  # o出現7次
ooooloooook # 中間含多個o
oooooolk    # o出現6次# 匹配 "loo*k":o至少出現1次(排除lk)
[root@syf ~]# grep "loo*k" a.txt
lok         # o出現1次
look        # o出現2次
loook       # o出現3次
looooook    # o出現5次
looooooook  # o出現7次
ooooloooook # 中間含多個o
案例 2:. 匹配 “任意 1 個字符”
# 匹配 "lo.*k":o后接“任意字符(0次或多次)”+k(.*表示任意字符任意次)
[root@syf ~]# grep "lo.*k" a.txt
lok                 # o后接0個字符
look                # o后接1個o
loook               # o后接2個o
looooook            # o后接4個o
loooooaaak          # o后接3個o+2個a
looooooook          # o后接5個o
ooooloooook         # 前面有o,中間含多個o# 匹配 "lo.k":o后接“恰好1個字符”+k
[root@syf ~]# grep "lo.k" a.txt
look                # o后接1個o(lo+o+k)# 匹配 "l..k":l后接“恰好2個字符”+k
[root@syf ~]# grep "l..k" a.txt
look                # l后接2個o(l+oo+k)
案例 3:\{n\}/\{n,\}/\{n,m\} 匹配 “固定次數”
# 匹配 "lo\{2\}k":o恰好出現2次
[root@syf ~]# grep "lo\{2\}k" a.txt
look                # o出現2次# 匹配 "lo\{3\}k":o恰好出現3次
[root@syf ~]# grep "lo\{3\}k" a.txt
loook               # o出現3次# 匹配 "lo\{3,\}k":o至少出現3次
[root@syf ~]# grep "lo\{3,\}k" a.txt
loook               # o出現3次
looooook            # o出現5次
looooooook          # o出現7次
ooooloooook         # 中間o出現5次# 匹配 "lo\{3,5\}k":o出現3~5次
[root@syf ~]# grep "lo\{3,5\}k" a.txt
loook               # o出現3次
ooooloooook         # 中間o出現5次(符合3~5次)
案例 4:^/$/^$ 匹配 “開頭 / 結尾 / 空行”
# 匹配 "^c":以c開頭的行
[root@syf ~]# grep "^c" b.txt
cdd
cdc
cdd# 匹配 "d$":以d結尾的行
[root@syf ~]# grep "d$" b.txt
abd
cdd
cdd# 匹配 "^$":空行(輸出為空行,對應b.txt中的空行)
[root@syf ~]# grep "^$" b.txt
(此處輸出1行空行)
案例 5:[list]/[^list] 匹配 “指定 / 非指定字符”
# 匹配 "lo[a-zA-Z0-9]k":o后接1個“字母/數字”+k
[root@syf ~]# grep "lo[a-zA-Z0-9]k" c.txt
lo1k        # o后接數字1
loAk        # o后接大寫A
loBk        # o后接大寫B
look        # o后接小寫o
loak        # o后接小寫a
lodk        # o后接小寫d# 匹配 "lo[ABo]k":o后接A/B/o中的任意1個
[root@syf ~]# grep "lo[ABo]k" c.txt
loAk        # A
loBk        # B
look        # o# 匹配 "lo[^a-zA-Z]k":o后接“非字母”(即數字/符號)
[root@syf ~]# grep "lo[^a-zA-Z]k" c.txt
lo1k        # 非字母(數字1)# 匹配 "[^a-zA-Z]":包含“非字母”的行(數字/符號)
[root@syf ~]# grep "[^a-zA-Z]" c.txt
lo12k       # 含數字1、2
lo1k        # 含數字1
1234        # 全是數字

三、擴展正則(Extended Regular Expression,ERE)

擴展正則是基礎正則的 “增強版”,新增了 +?()| 等元字符,且 {n}/{n,}/{n,m} 無需轉義。支持工具:egrepgrep -E)、awksed -r(擴展模式)

1. 擴展正則核心元字符表

元字符功能描述示例匹配效果
+匹配 “前面 1 個字符出現 1 次或多次”(比*嚴格)lo+k匹配 lok(1 次)、look(2 次),不匹配 lk
?匹配 “前面 1 個字符出現 0 次或 1 次”(最多 1 次)lo?k僅匹配 lk(0 次)、lok(1 次)
()將括號內的字符視為 “1 個整體”(分組)l(oo)+k匹配 look(oo1 次)、looook(oo2 次)
``邏輯 “或”:匹配多個模式中的任意 1 個`l(ooab)k`匹配 look(oo)、labk(ab)
{n}同基礎正則 \{n\},無需轉義lo{2}k匹配 look(o2 次)
{n,}同基礎正則 \{n,\},無需轉義lo{3,}k匹配 loook(o3 次)及以上
{n,m}同基礎正則 \{n,m\},無需轉義lo{3,5}k匹配 loook(o3 次)~looooook(o5 次)

2. 擴展正則實操案例(基于 a.txt

案例 1:+ 匹配 “前面字符 1 次及以上”
# 匹配 "lo+k":o至少1次(排除lk)
[root@syf ~]# egrep "lo+k" a.txt
lok         # o1次
look        # o2次
loook       # o3次
looooook    # o5次
looooooook  # o7次
ooooloooook # 中間o5次
案例 2:? 匹配 “前面字符 0 次或 1 次”
# 匹配 "lo?k":o最多1次(僅lk、lok)
[root@syf ~]# egrep "lo?k" a.txt
lk          # o0次
lok         # o1次
oooooolk    # 前面o6次,最后o0次(符合lo?k)
案例 3:() 分組匹配 “整體重復”
# 匹配 "l(oo)+k":將"oo"視為整體,至少重復1次
look        # "oo"重復1次(l+oo+k)
looooook    # "oo"重復2次(l+oo+oo+k)
looooooook  # "oo"重復3次(l+oo+oo+oo+k)
案例 4:| 邏輯 “或” 匹配多模式
# 先添加測試行 "labk" 到 a.txt
[root@syf ~]# echo "labk" >> a.txt# 匹配 "l(oo|ab)k":匹配 "loo k" 或 "lab k"
[root@syf ~]# egrep "l(oo|ab)+k" a.txt
look        # 匹配 "oo"
looooook    # 匹配 "oo"(重復2次)
looooooook  # 匹配 "oo"(重復3次)
labk        # 匹配 "ab"
案例 5:{n}/{n,}/{n,m} 無需轉義
# 匹配 "lo{3}k":o恰好3次(無需轉義{3})
[root@syf ~]# egrep "lo{3}k" a.txt
loook       # o3次# 匹配 "lo{3,}k":o至少3次
[root@syf ~]# egrep "lo{3,}k" a.txt
loook               # o3次
looooook            # o5次
looooooook          # o7次
ooooloooook         # 中間o5次# 匹配 "lo{3,5}k":o3~5次
[root@syf ~]# egrep "lo{3,5}k" a.txt
loook               # o3次
ooooloooook         # 中間o5次

四、特殊字符組(字符類)

為簡化正則書寫,Linux 提供了預定義字符組(又稱 “字符類”),等價于基礎正則中的某些字符集合,更易記憶和跨平臺(避免不同編碼的字符范圍問題)

特殊字符組表

字符組等價寫法描述應用場景
[[:alpha:]][a-zA-Z]匹配任意字母(大寫 + 小寫)提取純字母內容
[[:alnum:]][a-zA-Z0-9]匹配任意字母或數字提取賬號、ID(僅字母數字)
[[:blank:]][ \t]匹配空格或 Tab 鍵查找含空格 / Tab 的行
[[:digit:]][0-9]匹配任意數字(0~9)提取手機號、IP 地址中的數字部分
[[:lower:]][a-z]匹配任意小寫字母轉換為大寫前的篩選
[[:upper:]][A-Z]匹配任意大寫字母轉換為小寫前的篩選
[[:print:]]-匹配任意可打印字符(含空格、標點)排除不可見字符(如控制字符)
[[:punct:]][!\"#$%&...]匹配任意標點符號提取含標點的句子
[[:space:]][ \t\n\r...]匹配任意空白字符(空格、Tab、換行等)查找含空白字符的行

實操示例

# 1. 匹配含數字的行([[:digit:]] 等價于 [0-9])
[root@syf ~]# grep "[[:digit:]]" c.txt
lo12k
lo1k
1234# 2. 匹配純字母的行([[:alpha:]]+ 表示“字母出現1次及以上”)
[root@syf ~]# egrep "^[[:alpha:]]+$" c.txt
lok
loAk
loBk
look
loak
lodk
abcd# 3. 匹配含標點的行([[:punct:]])
[root@syf ~]# echo 'Hello,World!' > d.txt
[root@syf ~]# grep "[[:punct:]]" d.txt
Hello, World!  # 含逗號和感嘆號

核心知識點總結

  1. 基礎正則 vs 擴展正則
    • 基礎正則:{n}/{n,}/{n,m} 需轉義(\{n\}),無 +/?/()/|
    • 擴展正則:{n} 無需轉義,支持 +/?/()/|,工具用 egrep/sed -r/awk
  2. 元字符優先級
    • 分組 () > 次數 */+/?/{n} > 位置 ^/$ > 邏輯 |
  3. 特殊字符組:優先使用 [[:digit:]] 而非 [0-9],跨平臺更穩定

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

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

相關文章

Json-rpc通信項目(基于C++ Jsoncpp muduo庫)

一、介紹RPC RPC(Remote Procedure Call)遠程過程調用,一種通過網絡從遠程計算器上請求服務,而不需要了解底層網絡通信細節,RPC可以使用多種網絡協議進行通信,并且在TCP/IP網絡四層模型中跨越了傳輸層和應…

RL【9】:Policy Gradient

系列文章目錄 Fundamental Tools RL【1】:Basic Concepts RL【2】:Bellman Equation RL【3】:Bellman Optimality Equation Algorithm RL【4】:Value Iteration and Policy Iteration RL【5】:Monte Carlo Learnin…

Redis是什么?一篇講透它的定位、特點與應用場景

Redis是什么?一篇講透它的定位、特點與應用場景 1. Redis的定義與核心概念 1.1 什么是Redis? Redis(Remote Dictionary Server) 是一個開源的、基于內存的數據結構存儲系統,可以用作數據庫、緩存和消息代理。Redis由…

一款免費開源輕量的漏洞情報系統 | 漏洞情報包含:組件漏洞 + 軟件漏洞 + 系統漏洞

工具介紹 bug_search一款免費開源輕量的漏洞情報系統 基于python3 Amis2.9 開發,僅依賴Flask,requests,無需數據庫,Amis是百度開源的低代碼前端框架漏洞情報包含:組件漏洞 軟件漏洞 系統漏洞 增加郵件發送消息報警功能增加釘釘…

詳解在Windows系統中生成ssl證書,實現nginx配置https的方法

目錄一、下載安裝OpenSSL二、證書生成三、修改nginx配置總結Nginx 是一個高性能的HTTP和反向代理web服務器,在進行web項目開發時,大多都是使用nginx對外提供web服務。HTTPS (全稱:Hypertext Transfer Protocol Secure [5]&#xf…

AI視覺算法中的OpenCV API (二)

視頻寫入 (FourCC, VideoWriter)? 1. VideoWriter_fourcc - 視頻編碼器四字符代碼 # OpenCV 3.x, 4.x fourcc cv2.VideoWriter_fourcc(M,J,P,G)fourcc cv2.VideoWriter_fourcc(*H264)fourcc cv2.VideoWriter_fourcc(*MJPG) ?FourCC?: 代表 ?Four ?Charac…

分享| 2025年版AIGC數字人實驗室解決方案教學資源解析

AIGC數字人實驗室解決方案構建了涵蓋基礎層、平臺環境層與資源層的多層次教學架構,依托150平方米的實體空間與60人并行授課的規模化支持,為學生提供了技術實踐與創新的高效平臺。其教學資源體系覆蓋AIGC文本生成、圖像生成、數字人應用與智能體開發四大核…

內存大(巨)頁

一、大(巨)頁 大(巨)頁,很好理解,就是的大的頁。說這個大頁前,得先把計算機中內存的管理簡單說明一下,否則可能對于一些新手或者把操作系統中內存管理的方法的開發者不太友好。最早的…

langgraph astream使用詳解

langgraph中graph的astream(stream)方法分別實現異步(同步)流式應答,在langgraph-api服務也是核心方法,實現與前端的對接,必須要把這個方法弄明白。該方法中最重要的參數是stream_mode&#xff…

【C++】模板進階:非類型參數、模板特化與分離編譯

目錄 1. 非類型模板參數 2. 模板的特化 3. 分離編譯 1. 非類型模板參數 模板參數分類類型形參與非類型形參。 類型形參即:出現在模板參數列表中,跟在class或者typename之類的參數類型名稱。 非類型形參,就是用一個常量作為類(函數)模板…

棧-1047.刪除字符串中的所有相鄰重復項-力扣(LeetCode)

一、題目解析 1、反復執行重復項刪除操作 2、s僅由小寫英文字母組成 二、算法原理 該題并不難,難的是能不能想到用棧這個數據結構解題 解法:棧模擬 橫著看起來不好理解,我們把它豎起來,是不是和消消樂很類似,兩兩消…

【每日算法】移除元素 LeetCode

雙指針方法是解決數組或鏈表問題中非常高效的技巧之一,尤其適用于原地修改數組或減少時間復雜度的場景。以下是對雙指針方法的詳細講解。1. 雙指針方法的核心思想雙指針方法通常使用兩個指針(或索引)在數組或鏈表中協同工作,通過一…

Android 項目:畫圖白板APP開發(六)——分頁展示

本篇將介紹如何為我們的畫板應用添加分頁展示功能,讓用戶可以創建多個畫布并在它們之間輕松切換。這章沒有啥知識點的講解,主要介紹一下每頁保存的數據結構是什么樣的。 一、ListView 多頁數據的管理我們使用ListView。之前有文章講過ListView這里就不多…

智能眼鏡產品成熟度分析框架與評估

引言 當前(2025年9月12日),智能眼鏡(Smart Glasses)市場正處于快速演進階段,從早期的新奇設備向主流消費電子轉型。AI整合、AR顯示和多模態交互的進步推動了這一轉變。根據最新數據,2025年AI眼鏡發貨量預計達686萬臺,同比增長265%,全球市場規模從2024年的約19.3億美元…

(網絡編程)網絡編程套接字 UDP的socket API 代碼解析

網絡編程基礎 為什么需要網絡編程?--豐富的網絡資源 用戶在瀏覽器中,打開在線視頻網站,如優酷看視頻,實質是通過網絡,獲取到網絡上的一個視頻資源。與本地打開視頻文件類似,只是視頻文件這個資源的來源是網絡。 相比本地資源來說,網絡提供了更為豐富的網絡資源:所謂的網絡資源…

【STM32】狀態機(State Machine)

這篇博客介紹 狀態機(State Machine),適合用于嵌入式開發、驅動開發、協議解析、按鍵識別等多種場景。 一、什么是狀態機(State Machine)? 狀態機(State Machine)是一種用于描述系統…

深度學習在離崗檢測中的應用

離崗檢測技術正逐步成為現代企業精細化管理和安全生產的重要工具。這項基于計算機視覺和人工智能的應用,通過自動化、實時化的監測方式,有效提升了工作紀律性和運營效率,為項目管理者和企業提供了創新的監管解決方案。在許多工作場景中&#…

Spring緩存(二):解決緩存雪崩、擊穿、穿透問題

1. 緩存穿透問題與解決方案 1.1 什么是緩存穿透 緩存穿透是指查詢一個不存在的數據,由于緩存中沒有這個數據,每次請求都會直接打到數據庫。 如果有惡意用戶不斷請求不存在的數據,就會給數據庫帶來巨大壓力。 這種情況下,緩存失去了…

PHP 與 WebAssembly 的 “天然隔閡”

WebAssembly(簡稱 WASM)是一種低級二進制指令格式,旨在為高級語言提供高性能的編譯目標,尤其在瀏覽器環境中實現接近原生的執行效率。它主要用于前端性能密集型場景(如游戲引擎、視頻編解碼、3D 渲染等)&am…

unity中通過拖拽,自定義scroll view中子物體順序

1.在每個content的子物體上掛載DragHandler腳本,并且添加Canvs Group組件,設置見圖2.DragHandler腳本內容:using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System.Collections.Generic; using System.Coll…