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

Java 正則表達式深度教學:語法詳解與 Jakarta-ORO 實戰應用

     編輯:Java 相關知識

一、正則表達式基礎語法

正則表達式是定義字串搜尋模式的字元序列。若你曾使用 Perl、PHP、Python、JavaScript 等內建支援正則的語言,便知其處理文字之便利。Java 自 JDK 1.4 起透過 java.util.regex 原生支援;更早版本可使用 Apache Jakarta-ORO 函式庫。

1.1 句點符號 .

比對任意單一字元(含空白、Tab、換行)。例:t.n 可比對 tan、ten、tin、ton、t#n、t n 等。

1.2 方括號 [] 指定字元集合

僅比對括號內字元。例:t[aeio]n 僅比對 tan、ten、tin、ton;Toon 不符合(因方括號僅比對單一字元)。

1.3 「或」運算子 | 與分組 ()

需比對多字元選項時使用 | 搭配圓括號分組。例:t(a|e|i|o|oo)n 可比對 tan、ten、tin、ton、toon。

1.4 量詞:指定出現次數

符號說明
*零次或多次 {0,}
+一次或多次 {1,}
?零次或一次 {0,1}
{n}恰好 n 次
{n,m}n 到 m 次
{n,}至少 n 次

實例:社會安全號碼 (SSN) 比對

  • 格式 999-99-9999:\d{3}-\d{2}-\d{4}
  • 允許連字號可有可無:\d{3}-?\d{2}-?\d{4}

實例:美國車牌(四位數字+兩大寫字母)

[0-9]{4}[A-Z]{2}

1.5 否定符號 ^

在方括號內表示排除。例:[^X]\w* 比對非 X 開頭的單字。

1.6 圓括號分組與擷取

例:(\w+)\s+(\d{1,2}),\s+(\d{4}) 可從 June 26, 1951 擷取月份、日期、年份。使用 \s 比對空白字元。

1.7 常用簡寫符號

符號等價寫法說明
\d[0-9]數字
\D[^0-9]非數字
\w[a-zA-Z0-9_]單字字元
\W[^a-zA-Z0-9_]非單字字元
\s[ \t\n\r\f]空白字元
\S[^ \t\n\r\f]非空白字元

二、Jakarta-ORO 函式庫介紹

Jakarta-ORO(前身 OROMatcher)是功能最完整、效能最佳的開源正則函式庫之一,完整相容 Perl 5 語法。主要類別:

  • PatternCompiler:編譯正則為 Pattern 物件(如 Perl5Compiler)。
  • Pattern:編譯後的模式物件。
  • PatternMatcher:執行比對操作(如 Perl5Matcher),提供 matches()、matchesPrefix()、contains() 等方法。
  • PatternMatcherInput:支援從上次比對位置繼續搜尋,適合多重比對。

基本使用流程

PatternCompiler compiler = new Perl5Compiler();
Pattern pattern = compiler.compile("t[aeio]n");           // 大小寫敏感
// 或
Pattern pattern = compiler.compile("t[aeio]n", Perl5Compiler.CASE_INSENSITIVE_MASK);

PatternMatcher matcher = new Perl5Matcher();
boolean found = matcher.contains(inputString, pattern);   // 子字串比對

三、實戰應用範例

3.1 Web 伺服器日誌分析:擷取 IP 與時間戳記

BEA WebLogic 日誌格式範例:10.0.0.1 - - [26/Jun/2005:10:30:45 -0700] "GET /index.html HTTP/1.1" 200 1234

正則表達式(含分組擷取):

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s-\s-\s(\[.*?\])
  • 第一組 (\d{1,3}\.){3}\d{1,3} 比對 IP 位址(句點需跳脫)。
  • 第二組 \[.*?\] 比對方括號內的時間戳記(非貪婪模式)。
  • 中間 \s-\s-\s 比對固定分隔符。

Java 程式碼片段

String logEntry = "10.0.0.1 - - [26/Jun/2005:10:30:45 -0700] ...";
String regex = "(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})\\s-\\s-\\s(\\[.*?\\])";
// Java 字串中 \ 需雙重跳脫

PatternCompiler compiler = new Perl5Compiler();
Pattern pattern = compiler.compile(regex);
PatternMatcher matcher = new Perl5Matcher();

if (matcher.contains(logEntry, pattern)) {
    MatchResult result = matcher.getMatch();
    System.out.println("IP: " + result.group(1));
    System.out.println("Time: " + result.group(2));
}

3.2 HTML FONT 標籤屬性解析

目標:從 <FONT face="Arial, Serif" size="+2" color="red"> 擷取所有屬性並拆解為名稱-值對。

採用兩階段正則:

  1. 第一階段擷取完整屬性字串:<FONT\s+([^>]*)>
  2. 第二階段拆解單一屬性:(\w+)\s*=\s*"([^"]*)"

3.3 HTML 連結批次修改:域名遷移

將 widgets.acme.com 替換為 newserver.acme.com,保留路徑。

String regex = "(https://)widgets\\.acme\\.com(/.*)";
String replacement = "$1newserver.acme.com$2";
// $1、$2 為 Perl 風格反向參考,對應第一、二組

使用 Util.substitute() 執行替換:

String result = Util.substitute(matcher, pattern,
        new Perl5Substitution(replacement),
        inputString,
        Util.SUBSTITUTE_ALL);

四、結語

正則表達式是文字處理的利器,善用可大幅簡化字串擷取、驗證、替換、分割等工作。Jakarta-ORO 提供完整 Perl 5 相容 API,是 Java 專案引入正則功能的優秀選擇(JDK 1.4+ 專案建議直接使用原生 java.util.regex)。選擇傳統字串處理(StringTokenizer、charAt、substring)或正則表達式,端視專案複雜度與團隊熟悉度而定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved