首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

正則表達式匹配路徑:通配符 * 需配合字符集,Java matches 整串匹配詳解

     編輯:程式設計綜合問答

提問代碼分析

// 代碼 1
String regex = "com/xxx/ * /test";
String string = "com/xxx/utils/test";
System.out.println(string.matches(regex)); // false

// 代碼 2
String regex = "com/xxx/ * /pattern/ * ";
String string = "com/xxx/test/pattern/PatternTest1";
System.out.println(string.matches(regex)); // false

核心錯誤:* 不是通配符,是量詞「前面字符 0 次或多次」

  • *(空格後跟 *)匹配「0 個或多個空格」,而非「任意字符」。
  • / * / 僅匹配 / /、/ / 等帶空格的路徑,不匹配 /utils/。

正確寫法:用字符集 + 量詞

需求正則片段說明
匹配任意非斜槖字符(路徑段)[^/]+[^/] 非斜槖字符,+ 至少一個
匹配任意字符(含斜槖).*. 任意字符(除換行),* 任意次
匹配字母數字下劃線\w+等價 [a-zA-Z0-9_]+

修正後的正則

// 需求 1:com/xxx/任意路徑段/test
String regex1 = "com/xxx/[^/]+/test";
// 或更嚴格:com/xxx/\w+/test

// 需求 2:com/xxx/任意路徑/pattern/任意路徑
String regex2 = "com/xxx/[^/]+/pattern/[^/]+";
// 或:com/xxx/.*/pattern/.* (貪婪匹配,注意性能)

用戶輸入轉正則:通配符轉義

用戶輸入 com.xxx.*.pattern.*(以點分隔,* 為通配符),需轉換為 Java 正則:

public static String globToRegex(String glob) {
    StringBuilder sb = new StringBuilder();
    for (char c : glob.toCharArray()) {
        switch (c) {
            case '*': sb.append("[^.]*"); break; // 匹配非點字符任意次(路徑段)
            case '.': sb.append("\\."); break;   // 轉義點
            case '?': sb.append("[^.]"); break;  // 單字符通配
            default:  sb.append(c);
        }
    }
    return sb.toString();
}

// 測試
String userInput = "com.xxx.*.pattern.*";
String regex = globToRegex(userInput); 
// 結果:com\.xxx\.[^.]*\.pattern\.[^.]*
// 匹配:com.xxx.test.pattern.PatternTest1.class ✓

關鍵點總結

  1. String.matches(regex) 是整字符串匹配,等同於 ^regex$。
  2. * 單獨使用無意義,必須跟在字符/字符集後(如 .*、\w*、[^/]*)。
  3. 路徑匹配推薦 [^/]+ 精確匹配單段,避免 .* 貪婪跨段匹配導致錯誤或性能問題。
  4. 用戶通配符輸入需轉義特殊字符(. * ? 等)再映射為正則語法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved