正則入門到精通

?
![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/ee791b6fb74b4f649bdba48efea7c7ee.png

一、正則表達式入門?

正則表達式本質上是一串字符序列,用于定義一個文本模式。通過這個模式,我們可以指定要匹配的文本特征。例如,如果你想匹配一個以 “abc” 開頭的字符串,正則表達式可以寫作 “^abc”,其中 “^” 表示匹配字符串的開頭。?

(一)基本字符匹配?

在正則表達式中,普通字符(如字母、數字)通常表示它們自身。例如,正則表達式 “abc” 可以匹配文本中的 “abc” 序列。如果文本是 “abcdef”,那么 “abc” 會匹配成功;但如果文本是 “defabc”,那么匹配失敗,因為正則表達式是從左到右進行匹配的。?

案例(JavaScript):?

const text1 = "abcdef";?const regex1 = /abc/;?console.log(regex1.test(text1)); // 輸出: true??const text2 = "defabc";?const regex2 = /abc/;?console.log(regex2.test(text2)); // 輸出: false?

?

在上述代碼中,/abc/是一個正則表達式字面量,test方法用于測試給定的字符串是否包含匹配正則表達式的文本。?

(二)特殊字符?

正則表達式中有一些特殊字符,它們具有特殊的含義。例如:?

“.”(點號):匹配任意單個字符(除了換行符)。例如,“a.c” 可以匹配 “abc”、“adc” 等,但不能匹配 “ac”。?
”(星號):表示前面的字符可以出現零次或多次。例如,“abc” 可以匹配 “ac”、“abc”、“abbc” 等。?
“+”(加號):表示前面的字符至少出現一次。例如,“ab+c” 可以匹配 “abc”、“abbc” 等,但不能匹配 “ac”。?
“?”(問號):表示前面的字符可以出現零次或一次。例如,“ab?c” 可以匹配 “ac” 和 “abc”。?
”(脫字符):用于匹配字符串的開頭。例如,“abc” 表示匹配以 “abc” 開頭的字符串。?
“?

” 表示匹配以 “abc” 結尾的字符串。?

?

// “.”的案例?const text3 = "a1c a2c a c";?const regex3 = /a.c/;?console.log(text3.match(regex3)); // 輸出: ["a1c"],注意:match方法默認只返回第一個匹配結果??// “*”的案例?const text4 = "ac abc abbc abbbc";?const regex4 = /ab*c/;?console.log(text4.match(regex4)); // 輸出: ["abbbc"]??// “+”的案例?const text5 = "abc abbc abbbc";?const regex5 = /ab+c/;?console.log(text5.match(regex5)); // 輸出: ["abbbc"]??// “?”的案例?const text6 = "ac abc";?const regex6 = /ab?c/;?console.log(text6.match(regex6)); // 輸出: ["abc"]??// “^”的案例?const text7 = ["abcdef", "defabc", "abc"];?const regex7 = /^abc/;?text7.forEach(str => {?console.log(regex7.test(str)); ?// 輸出: true, false, true?});??// “$”的案例?const text8 = ["abc", "defabc", "abcd"];?const regex8 = /abc$/;?text8.forEach(str => {?console.log(regex8.test(str)); ?// 輸出: true, true, false?});?

?

在這些案例中,match方法用于在字符串中查找所有匹配正則表達式的子字符串,并返回一個數組。如果沒有找到匹配項,則返回null。test方法則用于判斷字符串是否與正則表達式匹配,返回true或false。?

(三)字符集?

字符集用于匹配一組特定的字符。例如,“[abc]” 可以匹配 “a”、“b” 或 “c”。字符集還可以使用范圍表示法,如 “[a-z]” 表示匹配任意一個小寫字母,“[0-9]” 表示匹配任意一個數字。?

// 匹配元音字母?const text9 = "apple banana cherry";?const regex9 = /[aeiou]/g;?console.log(text9.match(regex9)); ?// 輸出: ["a", "e", "a", "a", "e"],這里的“g”標志表示全局匹配,即找到所有匹配項??// 匹配數字?const text10 = "123abcABC";?const regex10 = /[0-9]/g;?console.log(text10.match(regex10)); // 輸出: ["1", "2", "3"]??// 匹配字母?const text11 = "123abcABC";?const regex11 = /[a-zA-Z]/g;?console.log(text11.match(regex11)); // 輸出: ["a", "b", "c", "A", "B", "C"]?

?

在上述代碼中,正則表達式中的 “g” 標志是非常重要的,它使得match方法能夠返回所有匹配的結果,而不僅僅是第一個。?

(四)分組?

分組是通過圓括號 “()” 來實現的。它可以將多個字符組合在一起,作為一個整體進行匹配。例如,“(abc)+” 表示匹配一個或多個 “abc” 序列。?

const text12 = "abcabcabc abcab ab";?const regex12 = /(abc)+/g;?console.log(text12.match(regex12)); ?// 輸出: ["abcabcabc", "abcab"]??

在這個例子中,通過分組我們能夠準確匹配由一個或多個 “abc” 序列組成的子字符串。?

二、正則表達式的進階應用?

(一)匹配特定格式的文本?

正則表達式可以用來匹配各種特定格式的文本,如日期、電話號碼、電子郵件地址等。例如,一個簡單的電子郵件地址匹配正則表達式可以寫作 “[a-zA-Z0-9_.±]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+”。這個表達式通過字符集和分組的方式,確保了電子郵件地址的基本格式。?

// 日期匹配?const text13 = "今天是2023-10-15,明天是2023-10-16";?const regex13 = /\d{4}-\d{2}-\d{2}/g;?console.log(text13.match(regex13)); ?// 輸出: ["2023-10-15", "2023-10-16"]??// 電話號碼匹配?const text14 = "聯系電話:13800138000";?const regex14 = /1\d{10}/;?console.log(text14.match(regex14)); // 輸出: ["13800138000"]??// 電子郵件地址匹配?const text15 = "我的郵箱是example@example.com,另一個是test_123@test-company.co.uk";?const regex15 = /[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+/g;?console.log(text15.match(regex15)); ?// 輸出: ["example@example.com", "test_123@test-company.co.uk"]??

這些案例展示了如何使用正則表達式在 JavaScript 中準確匹配常見的特定格式文本。?

(二)捕獲與替換?

正則表達式不僅可以用于匹配文本,還可以用于捕獲和替換文本。通過分組和捕獲功能,我們可以提取文本中的特定部分,并進行替換操作。例如,在文本編輯器中,我們可以使用正則表達式查找所有以 “http://” 開頭的鏈接,并將其替換為 “https://”。?

// 捕獲域名部分并替換鏈接協議?const text16 = "請訪問鏈接:http://example.com和http://test.com";?const regex16 = /http://([a-zA-Z0-9-.]+)/g;?const newText16 = text16.replace(regex16, "https://$1");?console.log(newText16); ?// 輸出: 請訪問鏈接:https://example.com和https://test.com??// 提取價格部分?const text17 = "蘋果價格是10元,香蕉價格是5元";?const regex17 = /價格是 (\d+) 元/g;?const prices = text17.match(regex17);?if (prices) {?prices.forEach(price => {?const num = price.match(/\d+/)[0];?console.log(parseInt(num)); ?// 輸出: 10, 5?});?}?

?

在第一個替換案例中,replace方法接受一個正則表達式和一個替換字符串,其中 “$1” 表示引用第一個捕獲組的內容。在第二個提取案例中,我們先通過正則表達式找到包含價格的子字符串,然后再進一步提取其中的數字。?

(三)貪婪與非貪婪匹配?

在正則表達式中,貪婪模式會盡可能多地匹配字符,而非貪婪模式則會盡可能少地匹配字符。例如,“ab” 是一個貪婪模式,它會匹配 “aabb” 中的 “aabb”;而 “a?b” 是一個非貪婪模式,它會匹配 “aabb” 中的 “ab” 和 “abb”。?

// 貪婪模式案例?const text18 = "aaaab";?const regex18 = /a*b/;?console.log(text18.match(regex18)); // 輸出: ["aaaab"]??// 非貪婪模式案例?const text19 = "aaaab";?const regex19 = /a*?b/;?console.log(text19.match(regex19)); // 輸出: ["ab"]??// 提取HTML標簽內內容的案例?const text20 = "<div>content1</div><div>content2</div>";?const greedyRegex = /<div>.*</div>/;?const nonGreedyRegex = /<div>.*?</div>/g;?console.log(text20.match(greedyRegex)); ?// 輸出: ["<div>content1</div><div>content2</div>"]?console.log(text20.match(nonGreedyRegex)); ?// 輸出: ["<div>content1</div>", "<div>content2</div>"]??

通過這些案例,可以清晰地看到貪婪模式和非貪婪模式在匹配行為上的差異。?

三、正則表達式的高級技巧?

(一)前瞻與后顧?

前瞻(Lookahead)和后顧(Lookbehind)是正則表達式中的高級功能。它們允許我們在匹配時考慮后面的或前面的字符,但不將其包含在匹配結果中。例如,“(?=abc) def” 表示匹配 “def”,但前提是它后面跟著 “abc”。?

// 正向前瞻案例?const text21 = "defabc defxyz";?const regex21 = /(?=abc)def/;?console.log(text21.match(regex21)); // 輸出: ["def"]??// 正向后顧案例?const text22 = "abcdef xyzdef";?const regex22 = /(?<=abc)def/;?console.log(text22.match(regex22)); // 輸出: ["def"]??

在 JavaScript 中,正向后顧在某些環境(如 Chrome 瀏覽器)中支持有限,上述代碼在支持正向后顧的環境中運行。?

(二)遞歸匹配?

遞歸匹配是一種強大的功能,可以用于匹配嵌套的結構,如括號嵌套。例如,“?

(?>[()]+∣(?R))?

” 可以匹配嵌套的括號結構。?

const text23 = "((a + b) * (c - d))";?const regex23 = /\((?>[^()]+|(?R))*\)/;?console.log(text23.match(regex23)); ?// 輸出: ["((a + b) * (c - d))"]??const text24 = "((a + b) * (c - d)";?console.log(text24.match(regex23)); ?// 輸出: null?

?

這個案例展示了遞歸匹配在處理嵌套結構時的有效性,以及在括號不完整時匹配失敗的情況。?

(三)性能優化?

正則表達式的性能優化非常重要,尤其是在處理大量文本時。避免使用過于復雜的正則表達式,盡量減少回溯次數,可以提高匹配效率。?

// 低效的匹配單詞方式?const longText = "這是一篇很長很長的文檔,包含了很多單詞,比如apple, banana, cherry等等";?const inefficientRegex = /[a-zA-Z]+|[^a-zA-Z]+/g;?console.time("inefficientMatch");?longText.match(inefficientRegex);?console.timeEnd("inefficientMatch"); ??// 高效的匹配單詞方式(先分割)?console.time("efficientMatch");?const words = longText.split(/[^a-zA-Z]+/).filter(word => word.length > 0);?console.timeEnd("efficientMatch"); ??

在這個案例中,通過console.time和console.timeEnd方法可以對比兩種方式的執行時間,明顯可以看出先分割的方式在處理大量文本時性能更優。?

四、正則表達式的實踐案例?

(一)數據清洗?

在數據處理中,正則表達式可以用于清洗文本數據。例如,去除文本中的多余空格、特殊字符等。?

// 去除多余空格?const text25 = " 你好,世界! ";?const regex25 = /\s+/g;?const cleanText25 = text25.replace(regex25, " ");?console.log(cleanText25); ?// 輸出: 你好,世界!??// 去除特殊字符?const text26 = "!@#Hello, World$%^";?const regex26 = /[!@#$%^&*(),.?":{}|<>]/g;?const cleanText26 = text26.replace(regex26, "");?console.log(cleanText26); ?// 輸出: Hello, World??

通過這些案例,我們可以看到正則表達式在數據清洗方面的便捷性。?

(二)文本提取?

從網頁或文檔中提取特定信息,如標題、鏈接、日期等,正則表達式是一個非常有用的工具。?

// 從網頁中提取鏈接?const htmlText = "<a href=\"http://example1.com\">鏈接1</a><a href=\"http://example2.com\">鏈接2</a>";?const linkRegex = /<a href="([^"]+)">/g;?const links = htmlText.match(linkRegex);?if (links) {?links.forEach(link => {?const url = link.match(/"([^"]+)"/)[1];?console.log(url); ?// 輸出: http://example1.com, http://example2.com?});?}??// 從文檔中提取標題?const docText = "# 標題1\n內容1\n# 標題2\n內容2";?const titleRegex = /^# (.*)$/gm;?const titles = docText.match(titleRegex);?if (titles) {?titles.forEach(title => {?const titleText = title.match(/# (.*)/)[1];?console.log(titleText); ?// 輸出: 標題1, 標題2?});?}??

這里的 “m” 標志表示多行匹配,使得正則表達式能夠匹配每一行以 “# ” 開頭的內容。?

(三)代碼分析?

在代碼編輯器中,正則表達式可以用于高亮顯示特定的代碼模式,如注釋、關鍵字等。?

const code = "# 這是一個注釋\nprint('Hello, World!')";?const commentRegex = /#.*$/gm;?const highlightedCode = code.replace(commentRegex, match => `<span style="color: green;">${match}</span>`);?console.log(highlightedCode); ?// 輸出: <span style="color: green;"># 這是一個注釋</span>?// print('Hello, World!')??const keywordRegex = /\b(print|def|class|if|else|for|while)\b/g;?const keywordHighlightedCode = highlightedCode.replace(keywordRegex, match?
=> <span style="color: blue;">${match}</span>);?
console.log (keywordHighlightedCode);?
// 輸出: # 這是一個注釋?
// print('Hello, World!')?
// 匹配函數定義?
const code2 = "def add (a, b):\n    return a + b";?
const functionRegex = /def\s+(\w+)\s*
?
(.??)
:/gm;?
const functions = code2.match(functionRegex);?
if (functions) {?
functions.forEach(func => {?
const name = func.match(/def\s+(\w+)\s*
?
(.??)
:/)[1];?
console.log(函數名: ${name});?
// 輸出:函數名: add?
});?
}?
// 匹配變量聲明?
const code3 = "int num = 10;\nstring text = 'Hello';";?
const variableRegex = /\b\w+\s+\w+\s*=/g;?
const variables = code3.match (variableRegex);?
if (variables) {?
console.log (variables);?
// 輸出: ["int num =", "string text ="]?
}??

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

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

相關文章

對備忘錄模式的理解

對備忘錄模式的理解 一、場景1、題目【[來源](https://kamacoder.com/problempage.php?pid1095)】1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 輸入示例1.5 輸出示例 2、理解需求 二、不采用備忘錄設計模式1、代碼2、問題3、錯誤的備忘錄模式 三、采用備忘錄設計模式1、代碼1.1 …

86.方便的double轉string屬性 C#例子 WPF例子

在C#開發中&#xff0c;屬性封裝是一種常見的設計模式&#xff0c;它可以幫助我們更好地控制數據的訪問和修改&#xff0c;同時提供更靈活的功能擴展。今天&#xff0c;我們就來探討一個簡單而優雅的屬性封裝示例&#xff1a;Power 和 PowerFormatted。 1. 問題背景 在實際開…

bun 版本管理工具 bum 安裝與使用

在使用 node 的過程中&#xff0c;我們可能會因為版本更新或者不同項目的要求而頻繁切換 node 版本&#xff0c;或者是希望使用更簡單的方式安裝不同版本的 node&#xff0c;這個時候我們一般會用到 nvm 或者類似的工具。 在我嘗試使用 bun 的時候&#xff0c;安裝前第一個想到…

GRE,MGRE

GRE&#xff1a;靜態過程&#xff0c;有局限性 R1 &#xff1a; [r1]interface Tunnel 0/0/0 --- 創建一個虛擬的隧道接口 [r1-Tunnel0/0/0]ip address 192.168.3.1 24 --- 給隧道接口分配一個 IP 地址 [r1-Tunnel0/0/0]tunnel-protocol gre --- 定義接口的封裝方式 [r1-Tun…

游戲無法啟動?XINPUT1_3.dll 丟失的終極解決方案

當你興奮地啟動一款新游戲時&#xff0c;突然彈出一個錯誤提示——‘程序無法啟動&#xff0c;因為計算機中丟失 XINPUT1_3.dll’。這種問題在 PC 玩家中非常常見&#xff0c;尤其是運行一些較老的游戲時。XINPUT1_3.dll 是 DirectX 運行庫的關鍵組件&#xff0c;缺失會導致游戲…

用大語言模型學文學常識

李白的詩句“右軍本清真”中的“清真”并非指伊斯蘭教信仰&#xff0c;而是對王羲之&#xff08;王右軍&#xff09;人格和藝術境界的贊美。以下是對這一問題的詳細分析&#xff1a; “清真”的古代含義 在魏晉至唐代的語境中&#xff0c;“清真”一詞多用于形容人的品格高潔、…

css炫酷的3D水波紋文字效果實現詳解

炫酷的3D水波紋文字效果實現詳解 這里寫目錄標題 炫酷的3D水波紋文字效果實現詳解項目概述技術棧核心實現1. 基礎布局2. 漸變背景3. 文字效果實現3.1 基礎樣式3.2 文字漂浮動畫 4. 水波紋效果4.1 模糊效果4.2 水波動畫 5. 交互效果 技術要點項目難點與解決方案總結 項目概述 在…

八、重學C++—動態多態(運行期)

上一章節&#xff1a; 七、重學C—靜態多態&#xff08;編譯期&#xff09;-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146999362?spm1001.2014.3001.5502 本章節代碼&#xff1a; cpp/dynamicPolymorphic.cpp CuiQingCheng/cppstudy - 碼云 - 開源中…

eventEmitter實現

沒有做任何異常處理,簡單模擬實現 事件對象的每一個事件都對應一個數組 /*__events {"事件1":[cb1,cb2],"事件2":[cb3,cb4],"事件3":[...],"事件4":[...],};*/class E{__events {};constructor(){}//注冊監聽回調on(type , callbac…

Mysql 中 B 樹 vs B+ 樹

&#x1f333; 什么是 B樹 和 B樹&#xff1f; 它們都是多路平衡查找樹&#xff08;M-Way Search Tree&#xff09;&#xff0c;用于提升磁盤讀寫效率&#xff0c;常用于數據庫&#xff08;如 MySQL&#xff09;、操作系統中的索引結構。 &#x1f50d; B樹 和 B樹 的核心區別…

藍橋云客---九宮幻方

1.九宮幻方 - 藍橋云課 九宮幻方 題目描述 小明最近在教鄰居家的小朋友小學奧數&#xff0c;而最近正好講述到了三階幻方這個部分&#xff0c;三階幻方指的是將1~9不重復的填入一個3 * 3的矩陣當中&#xff0c;使得每一行、每一列和每一條對角線的和都是相同的。 三階幻方又…

OrangePi5Plus開發板不能正確識別USB 3.0 設備 (綠聯HUB和Camera)

1、先插好上電&#xff08;可正確識別&#xff09; 2、上電開機后插入USB 3.0 設備&#xff0c;報錯如下&#xff0c;只能檢測到USB2.0--480M&#xff0c;識別不到USB3.0-5Gbps&#xff0c;重新插拔也不行 Apr 4 21:30:00 orangepi5plus kernel: [ 423.575966] usb 5-1: re…

LiveData 和 MutableLiveData 的區別

LiveData 和 MutableLiveData 的區別 主要在于是否可以修改數據&#xff0c;但它們的工作原理基本相同。下面我們深入對比它們的行為、特性&#xff0c;以及它們在 ViewModel 和 UI 層中的使用方式。 1. LiveData 和 MutableLiveData 的基本區別 特性LiveDataMutableLiveData可…

SDK中窗口調用

存在窗口A和B的win32程序 , 當點擊窗口A中的按鈕后會彈出窗口B #include <windows.h>// 窗口 B 的窗口過程 LRESULT CALLBACK WindowProcB(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_DESTROY:PostQuitMessage(0);break;default:ret…

進行性核上性麻痹:飲食調理為健康護航

進行性核上性麻痹是一種復雜的神經退行性疾病&#xff0c;目前雖無法根治&#xff0c;但合理的健康飲食有助于緩解癥狀、提高患者生活質量。 高蛋白質食物在患者飲食中占據重要地位。魚肉&#xff0c;尤其是富含 Omega-3 脂肪酸的三文魚、鱈魚等&#xff0c;不僅蛋白質含量豐富…

【Windows+Cursor】從0到1配置Arxiv MCP Server,實現論文自主查詢、下載、分析、綜述生成

1. 安裝UV Installation | uv powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 將安裝路徑添加到環境變量 C:\Users\xxxxxx\.local\bin 2. git clone 代碼 git clone https://github.com/blazickjp/arxiv-mcp-server.git…

WPF 教程:給 TreeView 添加 SelectedItem 雙向綁定支持(MVVM-Friendly)

&#x1f332;WPF 教程&#xff1a;給 TreeView 添加 SelectedItem 雙向綁定支持&#xff08;MVVM-Friendly&#xff09; 在 WPF 的 MVVM 應用中&#xff0c;TreeView 是非常常見的控件&#xff0c;但它有個“頑固”的缺陷&#xff1a; ?它的 SelectedItem 不是依賴屬性&…

Linux環境下內存錯誤問題排查與修復

最近這幾天服務器總是掉線&#xff0c;要查一下服務器的問題。可以首先查看一下計算機硬件&#xff0c;這是一臺某魚上拼湊的服務器&#xff1a; sudo lshw -shortH/W path Device Class Description system NF5270M3 (To be filled by O…

函數和模式化——python

一、模塊和包 將一段代碼保存為應該擴展名為.py 的文件&#xff0c;該文件就是模塊。Python中的模塊分為三種&#xff0c;分別為&#xff1a;內置模塊、第三方模塊和自定義模塊。 內置模塊和第三方模塊又稱為庫內置模塊&#xff0c;有 python 解釋器自帶&#xff0c;不用單獨安…

windows下載安裝遠程桌面工具RealVNC-Server教程(RealVNC_E4_6_1版帶注冊碼)

文章目錄 前言一、下載安裝包二、安裝步驟三、使用VNC-Viewer客戶端遠程連接&#xff0c;輸入ip地址&#xff0c;密碼完成連接 前言 在現代工作和生活中&#xff0c;遠程控制軟件為我們帶來了極大的便利。RealVNC - Server 是一款功能強大的遠程控制服務器軟件&#xff0c;通過…