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

Java 正則表達式貪婪匹配導致 JSON 字串解析失敗

     編輯:程式設計綜合問答

問題代碼

String line = "\"string\": \"Hello World\",";
Matcher m = Pattern.compile("\"(.*)\"\\s?:\\s?\"\\w\"\\s?,?").matcher(line);

目標是從 "string": "Hello World", 中提取鍵值,但正則無法匹配。

根本原因:貪婪匹配

  • "(.*)" 中的 .* 是貪婪模式,會盡可能多地匹配字符。
  • 在目標字串中,它會直接匹配到最後一個雙引號(即 World" 後的引號),導致後續的 \s?:\s?"\w" 無法匹配剩餘內容。

解決方案:懶惰匹配

在量詞後加 ? 開啟懶惰模式:

Pattern.compile("\"(.*?)\"\\s*:\"\\s*(.*?)\",?")
  • (.*?):非貪婪匹配任意字符,遇到下一個雙引號即停止。
  • \\s*:匹配任意空白(含 0 個),比 \\s? 更健壯。
  • 兩個捕獲組分別對應 key 和 value。

驗證代碼

String line = "\"string\": \"Hello World\",";
Pattern p = Pattern.compile("\"(.*?)\"\\s*:\"\\s*(.*?)\",?");
Matcher m = p.matcher(line);
if (m.find()) {
    System.out.println("Key: " + m.group(1));   // string
    System.out.println("Value: " + m.group(2)); // Hello World
}

延伸建議

  • 解析 JSON **請直接用成熟庫**(Jackson, Gson, org.json),手寫正則極易遺漏轉義、巢狀結構等邊界情況。
  • 若必須用正則,務必理解貪婪 vs 懶惰、反向引用、零寬斷言等核心概念。

總結

正則失敗是因為 .* 貪婪吞噬了後續結構。改用 .*? 即可精準提取鍵值對。實際項目中**強烈建議使用 JSON 解析庫**。

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