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

Java 正則表達式完整語法參考與實戰指南

     編輯:Java 程式設計入門

前言

正則表達式是文字處理的瑞士刀。Java 的 java.util.regex 遵循 Perl 5 風格,功能強大但語法繁雜。本文系統整理核心語法、邊界匹配、貪婪/勉強/佔有量詞、分組引用、旗標等,並附實戰範例。

核心語法速查表

1. 字元與轉義

語法說明
\\反斜線字元(Java 字串需寫 \\\\)
\\t \\n \\r \\f製表、換行、回車、換頁
\\xhh十六進位字元(2 位)
\\uhhhhUnicode 字元(4 位)
\\cx控制字元(Ctrl+x)

2. 字元類別

語法說明範例
[abc]簡單類別:a 或 b 或 c[aeiou]
[^abc]否定類別:非 a/b/c[^0-9]
[a-zA-Z]範圍:字母
[a-d[m-p]]聯集:a-d 或 m-p
[a-z&&[def]]交集:d、e、f
[a-z&&[^bc]]減去:a-z 除去 b、c

3. 預定義字元類別(雙重轉義)

語法等價說明
\\d[0-9]數字
\\D[^0-9]非數字
\\s[ \\t\\n\\x0B\\f\\r]空白字元
\\S[^\\s]非空白
\\w[a-zA-Z_0-9]單字字元
\\W[^\\w]非單字字元

4. 邊界匹配器

語法說明
^行首(需 MULTILINE 模式)
$行尾(需 MULTILINE)
\\b單字邊界
\\B非單字邊界
\\A輸入開頭
\\Z輸入結尾(不含最終換行)
\\z輸入絕對結尾

5. 量詞三大模式

類型0或10或多1或多恰好n至少nn到m
貪婪X?X*X+X{n}X{n,}X{n,m}
勉強X??X*?X+?X{n}?X{n,}?X{n,m}?
佔有X?+X*+X++X{n}+X{n,}+X{n,m}+

差異關鍵:貪婪優先吃盡再回溯;勉強逐字嘗試;佔有吃盡不回溯(效能最好但最易匹配失敗)。

6. 分組與反向引用

  • (X):捕獲組,編號從 1 起(左括號順序)。
  • \\n:引用第 n 組(如 (ab)\\1 匹配 abab)。
  • (?:X):非捕獲組(不佔編號、效能較好)。

7. 零寬斷言

8. 內嵌旗標

  • (?i):忽略大小寫(CASE_INSENSITIVE)
  • (?m):多行模式(MULTILINE)
  • (?s):單行模式(DOTALL,點號匹配換行)
  • (?x):註釋模式(COMMENTS,忽略空白、支援 # 註釋)
  • (?-i):關閉旗標
  • (?i:X):區域性開啟旗標

實戰範例

// 1. 驗證 Email(簡化版)
String emailRegex = "^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$";

// 2. 提取 HTML 標籤內容(非貪婪)
String html = "
Hello
World"; Pattern p = Pattern.compile("<([^>]+)>(.*?)"); Matcher m = p.matcher(html); while (m.find()) { System.out.println("Tag: " + m.group(1) + ", Content: " + m.group(2)); } // 3. 密碼強度:至少 8 碼、含大小寫、數字、特殊字元 String pwdRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%]).{8,}$";

效能優化建議

  1. 預編譯 Pattern:Pattern.compile(regex) 重複使用。
  2. 避免過度回溯:善用佔有量詞 X*+、原子組 (?>X)、具體化字元類別。
  3. 錨定開頭結尾:^...$ 減少不必要嘗試。
  4. 非捕獲組:不需反向引用時用 (?:...)。

總結

Java 正則功能完整,掌握「字元類別、量詞模式、邊界斷言、分組引用、旗標」五大核心,配合 Pattern/Matcher API,即可應對 95% 文字解析需求。記住:可讀性優於炫技,複雜邏輯拆分多個步驟往往更清晰。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
語法名稱條件範例
(?=X)正向前瞻右側匹配 X\\w+(?=\\d) 匹配數字前的單字
(?!X)負向前瞻右側不匹配 X\\w+(?!\\d)
(?<=X)正向後顧左側匹配 X(?<=19)99 匹配 19 後的 99
(?<!X)負向後顧左側不匹配 X