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

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

在編程世界中,正則表達式(Regular Expression,簡稱RegExp)被譽為“文本處理的瑞士軍刀”。它能夠高效地完成字符串匹配、替換、提取和驗證等任務。無論是前端開發中的表單驗證,還是后端數據清洗,正則表達式都扮演著不可或缺的角色。本文將帶你深入淺出地了解JavaScript中的正則表達式,從基礎語法到高級技巧,助你掌握這一強大工具。


一、正則表達式的“身份證”:創建方式

在JavaScript中,正則表達式可以通過兩種方式創建:

1. 字面量方式

字面量方式是最直觀的創建方式,使用斜杠 / 包裹模式,并附加標志(flags):

const regex1 = /pattern/flags;
  • pattern:定義匹配規則,例如 /abc/ 表示匹配字符串 “abc”。
  • flags:控制匹配行為,常見的標志包括:
    • g(全局匹配):匹配所有符合條件的內容。
    • i(忽略大小寫):匹配時不區分大小寫。
    • m(多行匹配):將輸入字符串視為多行文本。

示例

const regex = /\d+/g; // 匹配所有數字
console.log("123abc456".match(regex)); // 輸出 ["123", "456"]
2. 構造函數方式

通過 RegExp 構造函數動態創建正則表達式,適用于需要動態拼接模式的場景:

const regex2 = new RegExp('pattern', 'flags');

注意:構造函數中,特殊字符需要雙重轉義(如 \d 需要寫成 \\d)。

示例

const pattern = "\\d+"; // 匹配數字
const flags = "g";
const regex = new RegExp(pattern, flags);
console.log("123abc456".match(regex)); // 輸出 ["123", "456"]

二、正則表達式的核心語法:規則的“密碼本”

1. 元字符:賦予正則表達式“魔法”的符號

元字符是正則表達式中具有特殊含義的符號,它們能顯著提升匹配的靈活性。以下是一些常見元字符:

  • .:匹配除換行符外的任意單個字符。
  • *:匹配前一個元素 0次或多次
  • +:匹配前一個元素 1次或多次
  • ?:匹配前一個元素 0次或1次
  • ^:匹配字符串的開頭。
  • $:匹配字符串的結尾。
  • \d:匹配任意數字(等價于 [0-9])。
  • \w:匹配字母、數字或下劃線(等價于 [a-zA-Z0-9_])。
  • \s:匹配任意空白字符(空格、制表符、換行符等)。

示例

// 匹配以 "http" 開頭、以 ".com" 結尾的字符串
const urlRegex = /^http.*\.com$/;
console.log(urlRegex.test("https://example.com")); // true
2. 量詞:控制匹配次數的“節拍器”

量詞用于定義某個模式出現的次數,是正則表達式中最強大的工具之一:

語法含義
{n}恰好匹配 n
{n,}至少匹配 n
{n,m}匹配 nm
*等價于 {0,}
+等價于 {1,}
?等價于 {0,1}

示例

// 匹配 5~10 位數字
const phoneRegex = /^\d{5,10}$/;
console.log(phoneRegex.test("123456")); // true
3. 字符類:定義“選項菜單”的快捷方式

字符類使用方括號 [] 包裹,表示匹配其中任意一個字符:

  • [abc]:匹配 abc
  • [a-z]:匹配任意小寫字母。
  • [^a-z]:匹配非小寫字母的字符(^ 表示取反)。
  • [0-9A-F]:匹配十六進制數字。

示例

// 匹配 RGB 顏色代碼(如 #FF0000)
const colorRegex = /^#[0-9A-Fa-f]{6}$/;
console.log(colorRegex.test("#123ABC")); // true
4. 分組與捕獲:提取信息的“集裝箱”

使用圓括號 () 對模式分組,不僅能增強匹配邏輯,還能捕獲匹配到的子串:

  • 捕獲組:通過 $1$2 等引用匹配內容。
  • 非捕獲組:使用 (?:...) 表示僅分組,不捕獲。

示例

// 提取日期中的年月日
const dateRegex = /(\d{4})-(\d{2})-(\d{2})/;
const match = dateRegex.exec("2025-06-04");
console.log(match[1], match[2], match[3]); // 輸出 2025 06 04
5. 邊界匹配:定位文本的“坐標系”

邊界匹配符幫助我們精準定位字符串的開始、結束或單詞邊界:

  • ^:匹配字符串的開頭。
  • $:匹配字符串的結尾。
  • \b:匹配單詞邊界(如空格或標點)。
  • \B:匹配非單詞邊界。

示例

// 驗證郵箱格式(簡單版)
const emailRegex = /^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/;
console.log(emailRegex.test("user@example.com")); // true

三、高級技巧:正則表達式的“超能力”

1. 貪婪與非貪婪匹配

正則表達式默認是貪婪匹配(盡可能多地匹配字符),可以通過 ? 改為非貪婪匹配(盡可能少地匹配)。

示例

const text = "<div><span>Hello</span></div>";
const greedyRegex = /<.*>/; // 貪婪匹配
const nonGreedyRegex = /<.*?>/; // 非貪婪匹配
console.log(greedyRegex.exec(text)[0]); // 整個字符串
console.log(nonGreedyRegex.exec(text)[0]); // 第一個 <div>
2. 預查(Lookaround):條件匹配的“隱形眼鏡”

預查允許我們檢查某個位置是否滿足條件,而不消耗字符

  • 正向預查(?=...)(匹配后面必須滿足的條件)。
  • 負向預查(?!...)(匹配后面不能滿足的條件)。
  • 正向后顧(?<=...)(匹配前面必須滿足的條件)。
  • 負向后顧(?<!...)(匹配前面不能滿足的條件)。

示例

// 匹配后面跟著 "px" 的數字
const pxRegex = /\d+(?=px)/;
console.log(pxRegex.exec("100px 200em")); // 輸出 ["100"]
3. 命名捕獲組:讓結果更易讀

在ES2018中,可以通過 ?<name> 為捕獲組命名,提升代碼可讀性:

示例

const dateRegex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const match = dateRegex.exec("2025-06-04");
console.log(match.groups.year); // 輸出 "2025"

四、實戰場景:正則表達式的“用武之地”

1. 表單驗證

正則表達式是表單驗證的利器,可以快速判斷用戶輸入是否符合預期格式:

// 驗證手機號(中國手機號格式)
const phoneRegex = /^1[3-9]\d{9}$/;
function validatePhone(input) {return phoneRegex.test(input);
}
2. 數據提取

從文本中提取關鍵信息(如日志分析、爬蟲):

// 提取 HTML 標簽中的內容
const htmlRegex = /<(\w+)>(.*?)<\/\1>/g;
let match;
while ((match = htmlRegex.exec("<div>Hello</div>")) !== null) {console.log(`標簽: ${match[1]}, 內容: ${match[2]}`);
}
3. 文本替換

通過 replace() 方法實現復雜的替換邏輯:

// 將所有 "JavaScript" 替換為 "JS"
const text = "JavaScript is awesome! Learn JavaScript.";
const replacedText = text.replace(/JavaScript/g, "JS");
console.log(replacedText); // "JS is awesome! Learn JS."

五、注意事項:避免“踩坑”的指南針

  1. 性能問題
    復雜的正則表達式可能導致性能問題,尤其是涉及大量回溯時。建議通過非貪婪匹配、減少嵌套等方式優化。

  2. 安全性
    在處理用戶輸入時,避免直接使用用戶輸入構建正則表達式,防止正則表達式注入攻擊。

  3. 可讀性
    復雜的正則表達式難以維護。可以通過注釋、拆分邏輯或使用工具(如 Regex101)進行調試。


六、結語:從入門到精通的階梯

正則表達式是文本處理的強大工具,但它的學習曲線較為陡峭。掌握基礎語法后,建議通過實際項目不斷練習,并借助在線工具(如 RegExr)進行調試和優化。隨著熟練度的提升,你會發現正則表達式不僅能解決日常問題,還能成為你代碼中的“優雅解法”。

最后送大家一句話

“正則表達式是一門藝術,也是開發者必備的技能之一。實踐是掌握它的最佳途徑!”

希望這篇文章能為你打開正則表達式的大門,未來在代碼中游刃有余!

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

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

相關文章

基于LEAP模型在能源環境發展、碳排放建模預測及分析中實踐應用

在國家“3060”碳達峰碳中和的政策背景下&#xff0c;如何尋求經濟-能源-環境的平衡有效發展是國家、省份、城市及園區等不同級別經濟體的重要課題。根據國家政策、當地能源結構、能源技術發展水平以及相關碳排放指標制定合理有效的低碳能源發展規劃需要以科學準確的能源環境發…

Python爬蟲實戰:研究RoboBrowser庫相關技術

1. 引言 1.1 研究背景與意義 隨著電子商務的快速發展,商品信息呈現爆炸式增長。據 Statista 數據顯示,2025 年全球電子商務銷售額預計將達到 7.4 萬億美元,海量的商品數據蘊含著巨大的商業價值。對于電商企業而言,及時獲取競爭對手的產品信息、價格動態和用戶評價,能夠幫…

JVM垃圾回收器-ZGC

一、概述 ZGC&#xff08;Z Garbage Collector&#xff09;是一種高效且可擴展的低延遲垃圾回收器。在垃圾回收過程中&#xff0c;ZGC通過優化算法和硬件支持&#xff0c;將Stop-The-World&#xff08;STW&#xff09;時間控制在一毫秒以內&#xff0c;使其成為追求低延遲應用…

區間動態規劃

線性 DP 的一種&#xff0c;簡稱為「區間 DP」。以「區間長度」劃分階段&#xff0c;以兩個坐標&#xff08;區間的左、右端點&#xff09;作為狀態的維度。一個狀態通常由被它包含且比它更小的區間狀態轉移而來。 一、概念 間 DP 的主要思想就是&#xff1a;先在小區間內得到…

4. 數據類型

4.1 數據類型分類 分類 數據類型 說明 數值類型 BIT(M) 位類型。M指定位數&#xff0c;默認值1&#xff0c;范圍1 - 64 TINYINT [UNSIGNED] 帶符號的范圍 -128 ~ 127&#xff0c;無符號范圍0 ~ 255&#xff0c;默認有符號 BOOL 使用0和1表示真和假 SMALLINT [UNSIGNED] 帶符號是…

設計模式-2 結構型模式

一、代理模式 1、舉例 海外代購 2、代理基本結構圖 3、靜態代理 1、真實類實現一個接口&#xff0c;代理類也實現這個接口。 2、代理類通過真實對象調用真實類的方法。 4、靜態代理和動態代理的區別 1、靜態代理在編譯時就已經實現了&#xff0c;編譯完成后代理類是一個實際…

vue+element-ui一個頁面有多個子組件組成。子組件里面有各種表單,實現點擊enter實現跳轉到下一個表單元素的功能。

一個父組件里面是有各個子組件的form表單組成的。 我想實現點擊enter。焦點直接跳轉到下一個表單元素。 父組件就是由各個子組件構成 子組件就像下圖一樣的都有個el-form的表單。 enterToTab.js let enterToTab {}; (function() {// 返回隨機數enterToTab.addEnterListener …

Open SSL 3.0相關知識以及源碼流程分析

Open SSL 3.0相關知識以及源碼流程分析 編譯 windows環境編譯1、工具安裝 安裝安裝perl腳本解釋器、安裝nasm匯編器(添加到環境變量)、Visual Studio編譯工具 安裝dmake ppm install dmake # 需要過墻2、開始編譯 # 1、找到Visual Studio命令行編譯工具目錄 或者菜單欄直接…

【Redis】筆記|第5節|Redisson實現高并發分布式鎖核心源碼

一、加鎖流程 1. 核心方法調用鏈 RLock lock redisson.getLock("resource"); lock.lock(); // 阻塞式加鎖? lockInterruptibly()? tryAcquire(-1, leaseTime, unit) // leaseTime-1表示啟用看門狗? tryAcquireAsync()? tryLockInnerAsync() // 執行Lua腳本 2…

基于React + TypeScript構建高度可定制的QR碼生成器

前言 在現代Web應用中&#xff0c;QR碼已成為連接線上線下的重要橋梁。本文將詳細介紹如何使用React TypeScript Vite構建一個功能強大、高度可定制的QR碼生成器&#xff0c;支持背景圖片、文本疊加、HTML模塊、圓角導出等高級功能。 前往試試 項目概述 技術棧 前端框架:…

【MATLAB代碼】制導——三點法,二維平面下的例程|運動目標制導,附完整源代碼

三點法制導是一種導彈制導策略,主要用于確保導彈能夠準確追蹤并擊中移動目標。該方法通過計算導彈、目標和制導站之間的相對位置關系,實現對目標的有效制導。 本文給出MATLAB下的三點法例程,模擬平面上捕獲運動目標的情況訂閱專欄后可直接查看源代碼,粘貼到MATLAB空腳本中即…

Ubuntu22.04 安裝 IsaacSim 4.2.0

1. 從官網下載 IsaacSim 4.2.0 安裝包 https://download.isaacsim.omniverse.nvidia.com/isaac-sim-standalone%404.2.0-rc.18%2Brelease.16044.3b2ed111.gl.linux-x86_64.release.zip 2. 查閱 Workstation Installation 安裝方式 Workstation Installation — Isaac Sim Do…

開源量子模擬引擎:Quantum ESPRESSO本地部署教程,第一性原理計算輕松入門!

一、介紹 Quantum ESPRESSO 是一個用于電子結構計算和納米尺度材料建模的開源計算機代碼集成套件&#xff0c;專門用于進行第一性原理&#xff08;第一性原理&#xff09;計算&#xff0c;涵蓋了電子結構、晶體學和材料性能的模擬。 Quantum ESPRESSO GPU 版本支持GPU加速&am…

PVE 虛擬機安裝 Ubuntu Server V24 系統 —— 一步一步安裝配置基于 Ubuntu Server 的 NodeJS 服務器詳細實錄1

前言 最近在基于 NodeJS V22 寫一個全棧的項目&#xff0c;寫好了&#xff0c;當然需要配置服務器部署啦。這個過程對于熟手來說&#xff0c;還是不復雜的&#xff0c;但是對于很多新手來說&#xff0c;可能稍微有點困難。所以&#xff0c;我把整個過程全部記錄一下。 熟悉我…

【JUC】深入解析 JUC 并發編程:單例模式、懶漢模式、餓漢模式、及懶漢模式線程安全問題解析和使用 volatile 解決內存可見性問題與指令重排序問題

單例模式 單例模式確保某個類在程序中只有一個實例&#xff0c;避免多次創建實例&#xff08;禁止多次使用new&#xff09;。 要實現這一點&#xff0c;關鍵在于將類的所有構造方法聲明為private。 這樣&#xff0c;在類外部無法直接訪問構造方法&#xff0c;new操作會在編譯…

2. 庫的操作

2.1 創建數據庫 語法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name # 字符集: 存儲編碼 [DEFAULT] COLLATE collation_name # 校驗集: 比較/選擇/讀…

道可云人工智能每日資訊|北京農業人工智能與機器人研究院揭牌

道可云人工智能&元宇宙每日簡報&#xff08;2025年6月3日&#xff09;訊&#xff0c;今日人工智能&元宇宙新鮮事有&#xff1a; 北京農業人工智能與機器人研究院揭牌 5月30日&#xff0c;北京市農業農村局、北京市海淀區人民政府、北京市農林科學院共同主辦北京農業人…

【JSON-to-Video】設置背景視頻片斷

目錄 設置bgVideo字段 1. 設置bgVideo.videoList字段 2. 設置randomPlay字段 3. 設置complete字段 4. 調用API&#xff0c;制作視頻 歡迎來到JSON轉視頻系列教程。今天要教大家如何添加背景視頻片斷&#xff0c;在視頻制作中&#xff0c;巧妙運用背景視頻&#xff0c;能為…

星閃開發之Server-Client 指令交互控制紅燈亮滅案例解析(SLE_LED詳解)

系列文章目錄 星閃開發之Server-Client 指令交互控制紅燈亮滅的全流程解析&#xff08;SLE_LED詳解&#xff09; 文章目錄 系列文章目錄前言一、項目地址二、客戶端1.SLE_LED_Client\inc\SLE_LED_Client.h2.SLE_LED_Client\src\SLE_LED_Client.c頭文件與依賴管理宏定義與全局變…

Linux shell練習題

Shell 1. 判斷~/bigdata.txt 是否存在&#xff0c;若已存在則打印出”該文件已存在“&#xff0c;如不存在&#xff0c;則輸出打印&#xff1a;”該文件不存在“ if [ -f ./bigdata.txt ];then echo "文件存在" else echo "文件不存在" fi2. 判斷~/bigd…