Java 正則表達式白皮書:語法詳解、工程實踐與常用表達式庫


一、什么是正則表達式?

正則表達式(Regular Expression)是一種文本模式,用于描述、匹配、搜索或替換符合某種規則的字符串。其在日志提取、表單校驗、配置清洗、數據爬取等場景中被廣泛使用。

Java 提供了完整的正則表達式支持,核心類如下:

  • java.util.regex.Pattern:編譯正則表達式

  • java.util.regex.Matcher:對文本進行匹配、提取

  • String.matches() / replaceAll() / split() 等方法:簡化使用

示例代碼:

Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
Matcher matcher = pattern.matcher("2025-07-10");
if (matcher.matches()) {System.out.println("匹配成功");
}

二、正則表達式語法概覽(核心語法)

語法含義示例說明
.任意字符(除換行)a.c可匹配 abc, a9c
^開始^abc必須以 abc 開頭
$結束xyz$必須以 xyz 結尾
*0 次或多次a*可匹配 "", a, aaaa
+1 次或多次a+不匹配空串
?0 次或 1 次a?匹配 0 或 1 次 a
{n}恰好 n 次a{3}匹配 aaa
{n,}至少 n 次a{2,}至少兩個 a
{n,m}n~m 次a{2,4}2 到 4 個 a
[]字符類[abc]匹配 a、b、c 中任意一個
[^]排除字符類[^abc]不匹配 a/b/c
```cat
()分組(abc)+分組重復匹配
\d數字\d+等價于 [0-9]+
\w單詞字符[a-zA-Z0-9_]
\s空白字符包括空格、換行、制表符

三、Java 使用建議(工程實踐)

1. 推薦寫法:Pattern + Matcher

Pattern pattern = Pattern.compile("^[a-zA-Z0-9_-]{4,16}$");
Matcher matcher = pattern.matcher("user_1234");
if (matcher.matches()) {// 合法用戶名
}

2. 避免錯誤寫法

// 錯誤:正則表達式字符串忘記轉義
Pattern.compile("\d{3}"); // 實際匹配的是"d{3}",不是數字

應寫為:

Pattern.compile("\\d{3}");

四、正則表達式學習路徑

第一階段:語法基礎

  • 學習字符類([abc]\d)、量詞(*+?)、邊界(^$

第二階段:復雜匹配

  • 分組與捕獲、非貪婪匹配、斷言(正向 / 負向)

第三階段:調試與性能

  • 使用 Matcher 提取組信息、使用預編譯 Pattern 避免重復編譯

  • 注意回溯型表達式造成的性能問題(避免 (a+)+


五、常見場景與對應正則表達式

1. 表單驗證(校驗用戶輸入)

場景正則表達式說明
用戶名(4-16位)^[a-zA-Z0-9_-]{4,16}$字母數字下劃線
中文名^[\u4e00-\u9fa5]{2,10}$只支持中文
郵箱^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$常見郵箱格式
手機號(中國)^1[3-9]\d{9}$三大運營商
身份證(中國18位)`^\d{6}(1819
密碼強度(數字+字母)^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$至少一個字母和數字

2. 網絡相關

場景正則表達式
IPv4`^((25[0-5]
URL`^(http
域名^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\.)+[a-zA-Z]{2,}$

3. 時間與日期

場景正則表達式
日期(yyyy-MM-dd)^\d{4}-\d{2}-\d{2}$
時間(HH:mm:ss)`^([01]\d
年月日時間戳^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$

4. 日志抽取與數據清洗

場景正則表達式提示
提取日志級別`\b(INFODEBUG
提取 JSON 鍵值對"(\w+)":\s*"([^"]+)"適合簡單 JSON
去除 HTML 標簽<[^>]+>清洗富文本
去除空白字符\s+用于壓縮字符串
清除特殊字符[^a-zA-Z0-9\u4e00-\u9fa5]保留中英文與數字

六、常見問題與性能陷阱

?? 正則性能陷阱

  • (a+)+ 會造成回溯爆炸,處理大文本時極其慢;

  • 避免重復編譯:將 Pattern 定義為靜態成員或緩存;

  • 替換時,盡量使用非捕獲組 (?:...) 避免組開銷;

  • 編寫復雜表達式時推薦加注釋(Java 8+ 支持 (?x) 模式):

Pattern.compile("(?x)  # 啟用注釋模式\\d{4}            # 年份-                 # 分隔符\\d{2}            # 月份-                 # 日
");

七、構建正則表達式庫(正則標準化)

建議為團隊或項目構建統一正則工具類,方便調用與維護:

public class RegexLib {public static final String EMAIL = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$";public static final String PHONE = "^1[3-9]\\d{9}$";public static final String ID_CARD = "^\\d{17}[\\dXx]$";public static final String DATE = "^\\d{4}-\\d{2}-\\d{2}$";public static boolean match(String pattern, String input) {return Pattern.matches(pattern, input);}
}

使用:

if (RegexLib.match(RegexLib.EMAIL, "user@test.com")) {// 合法郵箱
}

八、總結:正則表達式在工程中的地位

在中大型項目中,正則表達式應作為工具語言中的基礎技能被系統掌握。學習正則不僅是掌握語法,更要理解其行為模型與性能特性,避免常見陷阱,構建可復用的正則庫。

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

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

相關文章

火山引擎Data Agent全面上線售賣!以企業級數據智能體,重構數據應用范式

資料來源&#xff1a;火山引擎-開發者社區 在火山引擎2025春季FORCE原動力大會現場&#xff0c;火山引擎數智平臺解決方案總經理蕭然宣布&#xff0c; 企業級數據智能體Data Agent即日起正式上線售賣 。該產品旨在通過DataAI的深度融合&#xff0c;助力企業實現數據價值的挖掘與…

uniapp AndroidiOS 定位權限檢查

定位權限檢查 // 檢查定位權限狀態 export const checkPermission () > {const platform uni.getSystemInfoSync().platform;console.log(platform, platform)// #ifdef APP-PLUSif (platform android) {// Androidreturn checkAndroidPermission();} else if (platform …

深入理解Java虛擬機(JVM):從內存管理到性能優化

深入理解Java虛擬機&#xff08;JVM&#xff09;&#xff1a;從內存管理到性能優化 目錄 引言JVM架構概述 1. 類加載器&#xff08;Class Loader&#xff09;2. 運行時數據區&#xff08;Runtime Data Areas&#xff09;3. 執行引擎&#xff08;Execution Engine&#xff09;…

PHP SimpleXML:深入理解與高效使用

PHP SimpleXML:深入理解與高效使用 引言 PHP SimpleXML 是一個用于解析和操作 XML 文檔的庫。它簡化了 XML 的處理過程,使得 PHP 開發者可以更加輕松地與 XML 數據交互。本文將深入探討 PHP SimpleXML 的基本概念、使用方法以及在實際開發中的應用。 SimpleXML 簡介 Simp…

雙模秒切,體驗躍遷!飛利浦EVNIA雙模游戲顯示器27M2N6801M王者降臨!

當沉浸式畫質與電競級流暢無法共存&#xff0c;EVNIA Mini LED雙模游戲顯示器27M2N6801M以破界之姿革新而來&#xff01;全新搭載 4K160Hz / FHD320Hz雙模顯示引擎&#xff0c;將視覺震撼與操作跟手性推向全新高度。心念所動間&#xff0c;即可在電影級3A世界與分秒必爭的電競戰…

Transformer:自注意力驅動的神經網絡革命引擎

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 從語言理解到多模態智能的通用架構基石 ?? 一、核心定義與歷史意義 …

汽車電子電氣架構中的關鍵計算單元解析

汽車電子電氣架構正經歷從分布式到集中式的重大變革&#xff0c;ECU、域控制器、中央計算單元等計算設備在這一演進過程中扮演著不同角色。這些設備按功能層級可分為傳統控制層、域集中層和中央計算層&#xff0c;各自承擔特定計算任務&#xff0c;共同構成智能汽車的"大腦…

Pandas 學習(數學建模篇)

今天學習數學建模2023年C篇&#xff08;228&#xff09;優秀論文 2023高教社杯全國大學生數學建模競賽C題論文展示&#xff08;C228&#xff09; - 2023C題論文 - 中國大學生在線 一.pd.DataFrame pd.DataFrame() 是 pandas 庫中用于創建二維表格數據結構&#xff08;DataFr…

第七講:C++中的string類

目錄 1、認識string類 2、標準庫中的string類 2.1、string類的常見接口 2.1.1、構造與賦值重載 2.1.2、迭代器 2.1.3、容量 2.1.4、訪問 2.1.5、修改 2.1.6、字符串操作 2.1.7、成員常量 2.1.8、非成員函數 2.1.9、轉換函數 2.2、vs和g下的string 2.2.1、vs下的s…

elementUI 前端表格table數據導出(一)

為啥前端導出不在贅述了第一步&#xff1a;安裝xlsxnpm install xlsx第二步&#xff1a;創建js文件html2excelimport * as XLSX from xlsx;const htmlToExcel {getExcel(dom, title temp){var excelTitle title;// const XLSX require("xlsx");var wb XLSX.util…

LabVIEW 波形圖表橫坐標顯示當前日期

LabVIEW 程序如何實現波形圖表橫坐標顯示當前日期一、XY Graph 時間關聯邏輯&#xff08;右上角分支&#xff09;功能本質實時采集當前系統時間&#xff08;秒數形式&#xff0c;基于 1904 基準&#xff09;&#xff0c;直接映射為 XY Graph 的 X 軸時間標識&#xff0c;實現動…

Android Soundtrigger喚醒相關時序學習梳理

本文所寫內容是在高通芯片平臺相關代碼基礎上學習整理匯總&#xff0c;如有描述不當之處&#xff0c;歡迎指正&#xff01;1、SoundTrigger注冊喚醒監聽事件回調流程&#xff08;SoundTrigger HAL層到ADSP層&#xff0c;不包括FWK層&#xff09;//(1)SoundTriggerSession 回調 …

OSPF實驗以及核心原理全解

OSPF&#xff08;Open Shortest Path First&#xff0c;開放式最短路徑優先&#xff09;是一種基于鏈路狀態的內部網關協議&#xff08;IGP&#xff09;&#xff0c;廣泛應用于中大型網絡中。它通過維護網絡拓撲信息&#xff0c;使用 SPF&#xff08;最短路徑優先&#xff09;算…

Using Spring for Apache Pulsar:Transactions

本節介紹Spring for Apache Pulsar如何支持事務。OverviewSpring for Apache Pulsar事務支持是基于Spring Framework提供的事務支持構建的。在高層&#xff0c;事務資源向事務管理器注冊&#xff0c;事務管理器反過來處理注冊資源的事務狀態&#xff08;提交、回滾等&#xff0…

在Ubuntu上從零開始編譯并運行Home Assistant源碼并集成HACS與小米開源的Ha Xiaomi Home

目錄1. 前言&&疊甲2. 使用的環境3. 相關鏈接4. 前期步驟4.1 安裝路徑提前說明4.2 Ubuntu 相關依賴安裝4.3 Python源碼編譯安裝4.3.1 編譯安裝4.3.2 換源4.3.3 環境變量5. 構建Home Assistant源碼5.1 clone源碼5.2 創建虛擬Python環境5.3 安裝項目依賴5.4 安裝項目5.5 運…

【實習篇】之Http頭部字段之Disposition介紹

Http頭部字段之DispositionDisposition頭部字段介紹RFC規范介紹RFC 6266與RFC 2047實習的時候公司將一個某個關于下載的Bug交給了我來修&#xff0c;看了代碼和日志后發現是Disposition字段的規范兼容性惹的鍋&#xff0c;因為有些協議使用的是老協議&#xff0c;我們的項目沒有…

VM文件管理與Vi/vim操作

[rootlocalhost /]# sudo mkdir /opt [rootlocalhost /]# sudo mkdir /opt/tmp [rootlocalhost /]# sudo touch /opt/tmp/a.txt [rootlocalhost /]# ls /opt/tmp/ a.txt [rootlocalhost /]# 3.步驟1&#xff1a;創建文件并插入日期時間vi /tmp/newfile在vi編輯器中輸入以下命令…

【Android】安卓四大組件之內容提供者(ContentProvider):從基礎到進階

你手機里的通訊錄&#xff0c;存儲了所有聯系人的信息。如果你想把這些聯系人信息分享給其他App&#xff0c;就可以通過ContentProvider來實現。。 一、什么是 ContentProvider ?ContentProvider? 是 Android 四大組件之一&#xff0c;負責實現?跨應用程序的數據共享與訪問…

Vue-19-前端框架Vue之應用基礎組件通信(二)

文章目錄 1 v-model(父子相傳)1.1 App.vue1.2 Father.vue1.2.1 v-model用在html標簽上1.2.2 v-model用在html標簽上(本質寫法)1.2.3 v-model用在組件標簽上1.2.4 v-model用在組件標簽上(本質寫法)1.3 MyInput(自定義的組件)1.4 修改modelValue1.4.1 Father.vue1.4.2 MyInput.vu…

寶塔下載pgsql適配spring ai

1.寶塔安裝pgvector 1.先去github下載pgvectorpgvector/pgvector: Open-source vector similarity search for Postgres 2.把壓縮包上傳到系統文件的/temp下解壓&#xff0c;重命名文件名為pgvector&#xff0c;之后命令操作 cd /tmp cd pgvector export PG_CONFIG/www/serv…