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

Java 正則表達式實戰(二):java.util.regex 核心 API 深度解析

     編輯:Java 相關知識

JDK 1.4 內建正則庫:Pattern 與 Matcher 雙核心

java.util.regex 以正則表達式編譯模式對字符串匹配。兩大核心類:

  • Pattern:編譯後的正則表達式模式
  • Matcher:狀態機器,依據 Pattern 對象匹配字符串

流程:Pattern.compile(regex) → pattern.matcher(input) 得到 Matcher → 匹配操作。多個 Matcher 可共用一個 Pattern。

Pattern 類完整方法詳解

方法說明
static Pattern compile(String regex)編譯正則表達式
static Pattern compile(String regex, int flags)帶標誌編譯:CASE_INSENSITIVE, MULTILINE, DOTALL, UNICODE_CASE, CANON_EQ
int flags()返回匹配標誌
Matcher matcher(CharSequence input)生成 Matcher 對象
static boolean matches(String regex, CharSequence input)一次性編譯匹配,適合單次使用
String pattern()返回編譯的正則表達式
String[] split(CharSequence input)按模式分割字符串
String[] split(CharSequence input, int limit)分割並限制段數

分割示例:按 "/" 分段

Pattern p = Pattern.compile("[/]+");
String[] result = p.split("Kevin.../凱文.../名詞:凱文。");
// 結果三段

// 限制兩段
String[] result2 = p.split("Kevin.../凱文.../名詞:凱文。", 2);
// 結果兩段,第二段含剩餘內容

對比 Jakarta-ORO:java.util.regex 只需 Pattern.compile(),更簡潔易懂。

Matcher 類核心方法分類詳解

1. 三種匹配查找操作

  • matches():整個目標字符串完全匹配才返回 true
  • lookingAt():檢測目標字符串是否以匹配子串起始
  • find() / find(int start):查找下一個匹配子串,可指定起始位置

均返回 boolean。

2. 替換操作四大方法

  • replaceAll(replacement):全部替換
  • replaceFirst(replacement):首次替換
  • appendReplacement(sb, replacement):當前匹配替換並將替換後子串及其之前到上次匹配後的片段加入 StringBuffer
  • appendTail(sb):最後一次匹配後剩餘字符串加入 StringBuffer

appendReplacement + appendTail 經典模式:

StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, "Kevin");  // 替換並累積
}
m.appendTail(sb);  // 處理尾部
// sb 即為完整替換結果

示例:將 "Kelvin" 全部改為 "Kevin",輸出過程清晰展示每次匹配後 sb 內容變化,最終得到正確結果。

3. 組信息獲取

  • group():當前匹配的所有組內容
  • group(int group):指定組內容
  • groupCount():組數量

示例:Pattern.compile("(ca)(t)") 匹配 "one cat,two cats...",groupCount()=2,group(1)="ca",group(2)="t"。

實戰:Email 地址合法性檢驗

public class Email {
    public static void main(String[] args) throws Exception {
        String input = args[0];
        // 1. 不能以 . 或 @ 起始
        if (Pattern.compile("^\\.|^\\@").matcher(input).find()) {
            System.err.println("EMAIL地址不能以'.'或'@'作為起始字符");
        }
        // 2. 不能以 www. 起始
        if (Pattern.compile("^www\\.").matcher(input).find()) {
            System.out.println("EMAIL地址不能以'www.'起始");
        }
        // 3. 檢測非法字符並清理
        Pattern p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");
        Matcher m = p.matcher(input);
        StringBuffer sb = new StringBuffer();
        boolean result = m.find();
        boolean deletedIllegalChars = false;
        while (result) {
            deletedIllegalChars = true;
            m.appendReplacement(sb, "");  // 刪除非法字符
            result = m.find();
        }
        m.appendTail(sb);
        input = sb.toString();
        if (deletedIllegalChars) {
            System.out.println("輸入包含非法字符,請修改");
            System.out.println("當前輸入:" + args[0]);
            System.out.println("修改後合法地址類似:" + input);
        }
    }
}

測試案例:

  • java Email www.kevin@163.net → 不能以 www. 起始
  • java Email 163.net → 不能以 . 或 @ 起始
  • java Email cgjmail#$%@163.net → 檢出非法字符,清理後為 cgjmail@163.net

總結

本文介紹 JDK 1.4 java.util.regex 核心類與方法。結合上篇 Jakarta-ORO 對比,讀者更易掌握。性能持續優化,最新信息請關注 SUN 官網。付費庫非必需,免費優秀庫足矣,有興趣者可自行查找第三方庫。

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