簡體   English   中英

大括號之間的Java正則表達式匹配

[英]Java Regex matching between curly braces

我需要解析一個日志文件並獲取時間和相關的函數調用字符串 這在日志文件中存儲如下: {"time" : "2012-09-24T03:08:50", "message" : "Call( ) 開始"}

在其他字符串字符之間會有多個記錄的時間函數調用,因此我希望使用正則表達式來瀏覽文件並獲取所有這些

我想獲取包括大括號在內的整個記錄​​信息

我已經嘗試了以下

Pattern logEntry = Pattern.compile("{(.*?)}");
Matcher matchPattern = logEntry.matcher(file);

Pattern.compile("{[^{}]*}");
Matcher matchPattern = logEntry.matcher(file);

我不斷收到非法重復錯誤,請幫助! 謝謝。

你需要用 '\\' 轉義 '{' & '}'

所以: "{(.*?)}"變成: "\\\\{(.*?)\\\\}"

你必須先用另一個 '\\' 轉義 '\\'

請參閱: http : //www.regular-expressions.info/reference.html以獲取需要轉義的字符的完整列表...

Braces是用於重復組的特殊正則表達式字符,因此您必須對它們進行轉義。

Pattern logEntry = Pattern.compile("\\{(.*?)\\}");

簡單的測試器:

 public static void main(String[] args) throws Exception {
        String x =  "{\"time\" : \"2012-09-24T03:08:50\", \"message\" : \"Call() started\"}";
        Pattern logEntry = Pattern.compile("\\{(.*?)\\}");
        Matcher matchPattern = logEntry.matcher(x);

        while(matchPattern.find()) {
            System.out.println(matchPattern.group(1));
        }

    }

給我:

"time" : "2012-09-24T03:08:50", "message" : "Call() started"

您應該使用積極的前瞻和后視:

(?<=\{)([^\}]+)(?=\})
  • (?<={) 匹配所有后面跟着 {
  • ([^}]+) 匹配任何不包含 } 的字符串
  • (?={) 匹配 { 之前的所有內容

regexp 中的 {} 有特殊含義,需要轉義。

通常轉義是通過在要轉義的字符前面加上反斜杠來實現的。 在用方括號定義的字符類中,您不需要這樣做

所以像

Pattern.compile("\{[^{}]*\}");

可能更接近你想做的事

這對於非嵌套括號非常適用,但對於像這樣的表達式

(sum(x) * 100) / (sum(y) + sum(z))

[az]*[\\{]+([a-zA-Z0-9]+)[\\}]+有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM