首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 正則表達式語法完整指南:元字符、量詞、分組與前瞻詳解

     編輯:Java 相關知識

正則表達式基礎概念

正則表達式是描述文本模式的強大工具,由普通字符(如 a-z)與特殊元字符組成。模式描述搜尋文本時要匹配的一個或多個字串。Java 透過 java.util.regex 套件提供完整支援。

常見範例速查

表達式匹配說明
^\s*$匹配空行
\d{2}-\d{5}驗證兩位數字-連字號-五位數字的 ID 格式
<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*/\1\s*>匹配 HTML 標籤(含屬性與巢狀內容)

元字符完整對照表

字符轉義與邊界

  • \:轉義下一字符,標記特殊字符、反向引用或八進制轉義。
  • ^:匹配輸入字串開頭;多行模式下匹配 \n 或 \r 後位置。
  • $:匹配輸入字串結尾;多行模式下匹配 \n 或 \r 前位置。
  • \b:單字邊界(字與空格間位置)。
  • \B:非單字邊界。

量詞(貪婪/非貪婪)

在量詞後加 ? 切換為非貪婪模式(如 +?、*?),匹配最短字串。

字符類與預定義字符類

  • .:匹配除 \n 外任意字符(含 \n 用 [\s\S])。
  • [xyz]:字符集,匹配任一字符。
  • [^xyz]:反向字符集。
  • [a-z]:字符範圍。
  • \d:數字 [0-9];\D:非數字。
  • \s:空白字符(空格、製表、換頁等);\S:非空白。
  • \w:單字字符(字母、數字、底線);\W:非單字字符。

分組與前瞻

量詞說明等效寫法
*零次或多次{0,}
+一次或多次{1,}
?零次或一次{0,1}
{n}正好 n 次—
{n,}至少 n 次—
{n,m}至少 n 次,至多 m 次—
語法名稱說明
(pattern)捕獲組匹配並捕獲,可用 $1~$9 反向引用。
(?:pattern)非捕獲組匹配不捕獲,用於 | 組合優化(如 industr(?:y|ies))。
(?=pattern)正向前瞻匹配 pattern 前的位置,不消耗字符(如 Windows(?=95|98|NT))。
(?!pattern)負向前瞻匹配非 pattern 前的位置(如 Windows(?!95|98|NT))。

其他特殊構造

  • x|y:或運算,匹配 x 或 y。
  • \cx:控制字符(如 \cM 回車)。
  • \xnn:十六進制轉義(兩位)。
  • \unnnn:Unicode 字符(四位十六進制)。
  • \n、\nm、\nml:八進制轉義或反向引用(視上下文)。

Java 程式碼實戰範例

import java.util.regex.*;

public class RegexDemo {
    public static void main(String[] args) {
        String text = "Contact: user@example.com, phone: 02-12345678";
        
        // 編譯模式
        Pattern emailPattern = Pattern.compile("\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b");
        Pattern phonePattern = Pattern.compile("\\d{2}-\\d{8}");
        
        // 匹配器操作
        Matcher m = emailPattern.matcher(text);
        while (m.find()) {
            System.out.println("Email: " + m.group());
        }
        
        // 替換示例
        String masked = phonePattern.matcher(text).replaceAll("XX-XXXXXXXX");
        System.out.println("Masked: " + masked);
    }
}

最佳實踐建議

  1. 複雜模式預先編譯 Pattern 物件重用,避免重複編譯開銷。
  2. 善用非捕獲組 (?:...) 提升效能與簡化群組編號。
  3. 大量資料處理時,考慮 Matcher.useTransparentBounds 等進階 API。
  4. 正則雖強,但非萬能:複雜巢狀結構(如完整 HTML/JSON 解析)請用專用解析器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved