Java中正則表達式使用方法

1. 正則表達式概述

正則表達式(Regular Expression,簡稱 Regex)是一種用于匹配字符串的模式工具。在 Java 中,正則表達式通過 java.util.regex 包實現,主要涉及以下兩個類:

  • Pattern:表示一個編譯好的正則表達式模式。
  • Matcher:用于在字符串中查找與模式匹配的內容。

正則表達式可以用來驗證格式、提取信息或替換文本,例如檢查郵箱地址是否合法、提取字符串中的數字、按規則分割字符串等。

2. 正則表達式符號速查表

以下是正則表達式的常用符號和元字符(以正則表達式的原始形式列出)。在 Java 代碼中,符號如 \d 需要寫成 \\d,因為 Java 字符串需要轉義反斜杠。

2.1 基本字符和元字符

符號含義示例不匹配示例
\d匹配一個數字(0-9)5a
\D匹配一個非數字a5
\w匹配字母、數字或下劃線a3_!
\W匹配非字母、數字或下劃線!@a
\s匹配一個空白字符(如空格、制表符、換行符)\na
\S匹配一個非空白字符a1空白字符
.匹配任意字符(除換行符外)a1.\n

2.2 字符集合

字符集合用方括號 [] 表示,用于匹配單個字符。以下是詳細說明:

符號含義示例不匹配示例
[abc]匹配單個字符,且該字符是 abcabcab(多字符)、d
[^abc]匹配單個字符,且該字符不是 abcd1abc
[a-z]匹配單個小寫字母(a 到 z)bA1
[A-Z]匹配單個大寫字母(A 到 Z)Ba1
[a-zA-Z]匹配單個字母(大小寫均可)Ab1
[0-9]匹配單個數字(0 到 9)5a
[a-z&[def]]匹配單個字符,且該字符是 a 到 z 中且是 defdefab
[a-z&&[^bc]]匹配單個字符,且該字符是 a 到 z 但不是 bcadbc
[a-z&&[^m-p]]匹配單個字符,且該字符是 a 到 z 但不是 m 到 paqmn

說明[abc] 只匹配單個字符,不會匹配連續的字符串。例如:

  • 字符串 ab[abc] 會匹配 a(第一個字符),再匹配 b(第二個字符),但不能直接匹配整個 ab
  • 如果要匹配 ab,需要寫成 ab(連續字符模式),而不是 [ab]

2.3 量詞

量詞用于指定匹配的次數:

符號含義示例不匹配示例
+匹配 1 次或多次\d+ 匹配 123空字符串
*匹配 0 次或多次\d* 匹配 12 或空
?匹配 0 次或 1 次\d? 匹配 1 或空12(多于 1 個)
{n}匹配正好 n 次\d{2} 匹配 121123
{n,}匹配至少 n 次\d{2,} 匹配 1231
{n,m}匹配 n 到 m 次\d{2,3} 匹配 1212311234

2.4 邊界匹配

符號含義示例不匹配示例
^匹配字符串的開頭^a 匹配 abc 的開頭bac
$匹配字符串的結尾a$ 匹配 cba 的結尾abc
\b匹配單詞邊界\bword\b 匹配單獨的 wordkeyword

3. 使用方法

Java 提供了兩種主要方式來使用正則表達式:通過 PatternMatcher 類,或者直接使用 String 類的方法。

3.1 使用 PatternMatcher

步驟

  1. 使用 Pattern.compile() 創建正則表達式模式(注意轉義)。
  2. 使用 Pattern.matcher() 創建一個匹配器。
  3. 使用 Matcher.find()Matcher.group() 查找并獲取匹配結果。

示例代碼:提取字符串中的所有數字,并展示字符集合的匹配。

import java.util.regex.Pattern;
import java.util.regex.Matcher;public class RegexDemo {public static void main(String[] args) {// 示例 1:提取數字String input = "Order: 123, Price: 456";Pattern pattern = Pattern.compile("\\d+"); // 正則表達式 \d+(匹配 1 個或多個數字)Matcher matcher = pattern.matcher(input);System.out.println("提取的數字:");while (matcher.find()) {System.out.println(matcher.group());}// 示例 2:字符集合 [abc] 的匹配String text = "ab";Pattern pattern2 = Pattern.compile("[abc]"); // 正則表達式 [abc](匹配單個 a、b 或 c)Matcher matcher2 = pattern2.matcher(text);System.out.println("\n字符集合 [abc] 匹配結果:");while (matcher2.find()) {System.out.println("匹配到的字符:" + matcher2.group());}}
}

運行結果

提取的數字:
123
456字符集合 [abc] 匹配結果:
匹配到的字符:a
匹配到的字符:b

說明:在字符串 ab 中,[abc] 每次只匹配一個字符,先匹配到 a,再匹配到 b,但它不會將 ab 作為一個整體匹配。

3.2 使用 String 類的方法

String 類提供了幾種簡便的方法:

  • matches():判斷整個字符串是否完全匹配正則表達式。
    String text = "12345";
    boolean isNumber = text.matches("\\d+"); // 返回 true
    System.out.println("是否全為數字:" + isNumber);
    
  • replaceAll():替換所有匹配正則表達式的部分。
    String text = "abc123def456";
    String result = text.replaceAll("\\d+", "-"); // 結果:abc-def-
    System.out.println("替換數字后的結果:" + result);
    
  • split():按正則表達式分割字符串。
    String text = "a,b,c";
    String[] parts = text.split(","); // 結果:["a", "b", "c"]
    System.out.println("分割結果:" + java.util.Arrays.toString(parts));
    

4. 應用實例

4.1 驗證郵箱地址

public class EmailValidation {public static void main(String[] args) {String email = "user@example.com";String emailPattern = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";if (email.matches(emailPattern)) {System.out.println("郵箱格式正確:" + email);} else {System.out.println("郵箱格式錯誤:" + email);}}
}

運行結果

郵箱格式正確:user@example.com

4.2 驗證手機號碼

public class PhoneValidation {public static void main(String[] args) {String phone = "13812345678";String phonePattern = "^1[3-9]\\d{9}$";if (phone.matches(phonePattern)) {System.out.println("手機號碼格式正確:" + phone);} else {System.out.println("手機號碼格式錯誤:" + phone);}}
}

運行結果

手機號碼格式正確:13812345678

4.3 提取單詞

public class WordExtraction {public static void main(String[] args) {String input = "Hello world, this is a test";Pattern pattern = Pattern.compile("\\b\\w+\\b"); // 正則表達式 \b\w+\b(匹配單詞)Matcher matcher = pattern.matcher(input);while (matcher.find()) {System.out.println("找到的單詞:" + matcher.group());}}
}

運行結果

找到的單詞:Hello
找到的單詞:world
找到的單詞:this
找到的單詞:is
找到的單詞:a
找到的單詞:test

4.4 驗證連續字符

如果需要匹配連續的字符(如 ab),不能使用 [ab],而是直接寫成 ab

public class SequenceMatch {public static void main(String[] args) {String input = "cabd";Pattern pattern = Pattern.compile("ab"); // 正則表達式 ab(匹配連續的 ab)Matcher matcher = pattern.matcher(input);while (matcher.find()) {System.out.println("找到的連續字符:" + matcher.group());}}
}

運行結果

找到的連續字符:ab

5. 注意事項

  • 性能優化:避免在循環中重復調用 Pattern.compile(),建議將 Pattern 對象定義為靜態變量。
  • 轉義規則:正則表達式中的特殊字符(如 .+)需要轉義,在 Java 中需要雙重轉義,例如正則表達式 \. 要寫成 \\.

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

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

相關文章

使用瀏覽器的Clipboard API實現前端復制copy功能

在前端開發中,復制文本到剪貼板的功能通常使用瀏覽器的 Clipboard API 實現。比如 navigator.clipboard.writeText 方法。以下是一個簡單的案例,展示如何使用 Clipboard API 實現復制文本的功能。 基本用法 首先,你需要創建一個按鈕&#x…

【因果推斷】(二)CV中的應用

文章目錄 因果表征學習因果圖 (Causal Diagram)“后門準則”(backdoor criterion)和“前門準則”(frontdoor criterion)后門調整Visual Commonsense R-CNNCausal Intervention for Weakly-Supervised Semantic SegmentationCausal…

【iOS】alloc init new底層原理

目錄 前言 alloc alloc核心操作 cls->instanceSize(extraBytes) calloc obj->initInstanceIsa init 類方法: 實例方法: new 前言 筆者最近在進行對OC語言源碼的學習,學習源碼的過程中經常會出現一些從來沒有遇見過的函數&…

QT窗口相關控件及其屬性

widget,PushButton,lineEdit等都是基于QWidget延展出來的 并不是完整的窗口,而是作為窗口的一部分 真正的窗口是QMainWindow 菜單欄 Qt中的菜單欄是通過QMenuBar這個類來實現的,一個主窗口最多只有一個菜單欄,位于主…

day47—雙指針-平方數之和(LeetCode-633)

題目描述 給定一個非負整數 c ,你要判斷是否存在兩個整數 a 和 b,使得 a^2 b^2 c 。 示例 1: 輸入:c 5 輸出:true 解釋:1 * 1 2 * 2 5示例 2: 輸入:c 3 輸出:f…

藍橋杯 20. 壓縮變換

壓縮變換 原題目鏈接 題目描述 小明最近在研究壓縮算法。他知道,壓縮時如果能夠使數值很小,就能通過熵編碼得到較高的壓縮比。然而,要使數值變小是一個挑戰。 最近,小明需要壓縮一些正整數序列,這些序列的特點是&a…

element-ui多個form同時驗證,以及動態循環表單注意事項

多個form同時驗證: validateForm(refs) {if (!refs) {return false}return new Promise((resolve, reject) > {refs.validate().then((valid) > {resolve(valid)}).catch((val) > {resolve(false)})}) }, async handleConfirm() {Promise.all([this.valid…

Spring Boot中自定義404異常處理問題學習筆記

1. 問題背景 在Spring Boot項目中,需要手動返回404異常給前端。為此,我創建了一個自定義的404異常類UnauthorizedAccessException,并在全局異常處理器GlobalExceptionHandler中處理該異常。然而,在使用Postman測試時,…

你學會了些什么220622?--搭建UI自動化

jenkins訪問地址:http://192.168.82.129:8080/ 賬號密碼:admin/a123456a ***** 什么是UI自動化** 使用工具或者腳本對需要測試的軟件的前端界面在預設的條件下,在已有的測試數據下運行系統或者應用程序,并獲取其前端頁面UI顯示的…

【2025計算機網絡-面試常問】http和https區別是什么,http的內容有哪些,https用的是對稱加密還是非對稱加密,流程是怎么樣的

HTTP與HTTPS全面對比及HTTPS加密流程詳解 一、HTTP與HTTPS核心區別 特性HTTPHTTPS協議基礎明文傳輸HTTP SSL/TLS加密層默認端口80443加密方式無加密混合加密(非對稱對稱)證書要求不需要需要CA頒發的數字證書安全性易被竊聽、篡改、冒充防竊聽、防篡改…

JavaFX 第一篇 Hello World

1、簡介 JavaFX 是一個用于構建客戶端應用程序的 Java 庫,作為 Java 標準庫的一部分(JDK 8 到 10),從 JDK 11 開始,JavaFX 將以獨立模塊發布,將不再包含在 JDK標準庫中,他是 Java 應用程序開發的…

SQL實戰:02之連續數問題求解

文章目錄 概述題目:體育館的人流量題解步驟一:構造出一個連續序列步驟二:找出符合條件的組的序號步驟三:fetch結果,使用內連接過濾出符合條件的記錄。完整SQL 題目二:連續出現的數字題解步驟一:分區并構建連…

STM32 的 GPIO和中斷

GPIO的簡單介紹 內部結構 施密特觸發器(TTL肖特基觸發器) 的工作原理: 施密特觸發電路(簡稱)是一種波形整形電路,當任何波形的信號進入電路時,輸出在正、負飽和之間跳動,產生方波或…

Server - 優雅的配置服務器 Bash 環境(.bashrc)

歡迎關注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/147335592 免責聲明:本文來源于個人知識與公開資料,僅用于學術交流,歡迎討論,不支持轉載。 登錄服…

使用PyTorch實現圖像增廣與模型訓練實戰

本文通過完整代碼示例演示如何利用PyTorch和torchvision實現常用圖像增廣方法,并在CIFAR-10數據集上訓練ResNet-18模型。我們將從基礎圖像變換到復雜數據增強策略逐步講解,最終實現一個完整的訓練流程。 一、圖像增廣基礎操作 1.1 準備工作 #matplotli…

解決Mac 安裝 PyICU 依賴失敗

失敗日志: 解決辦法 1、使用 homebrew 安裝相關依賴 brew install icu4c 安裝完成后,設置環境變量 echo export PATH"/opt/homebrew/opt/icu4c77/bin:$PATH" >> ~/.zshrcecho export PATH"/opt/homebrew/opt/icu4c77/sbin:$PATH…

Springboot后端查詢參數接收

1.實現方式 假設前端發送的接口: /users?nameJohn&age30 后端怎么接收里面的name和age呢?以及再發別的參數后端怎么接收呢? 1.比較簡單的方式 當控制器方法的參數類型是簡單類型(如 String、Integer、Long 等&#xff09…

桌面應用中VUE使用新瀏覽器窗口打開頁面

1、瀏覽器應用忽略此方式,可任意方式打開。針對桌面應用設置 newWindowClick(){try {this.fileUrl "";this.params.year ""this.params.date ""axios({method: post,url: /url/pdf/preview,data: this.params,}).then(res> {t…

華為手機怎么進行音頻降噪?音頻降噪技巧分享:提升聽覺體驗

在當今數字化時代,音頻質量對于提升用戶體驗至關重要,無論是在通話、視頻錄制還是音頻文件播放中,清晰的音頻都能帶來更佳的聽覺享受。 而華為手機憑借其強大的音頻處理技術,為用戶提供了多種音頻降噪功能,幫助用戶在…

【數據可視化-22】脫發因素探索的可視化分析

?? 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個…