2012-09-25 92 views
11

我需要解析日誌文件並獲取時間和相關函數調用字符串 這存儲在日誌文件中,如下所示:{「time」:「2012-09-24T03:08: 50「,」message「:」Call()started「}花括號之間的正則表達式匹配

在其他字符串字符之間會有多個記錄的時間函數調用,所以我希望使用正則表達式來檢查所有這些文件

我想抓住整個記錄的信息包括大括號

我曾嘗試以下

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

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

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

回答

25

你需要逃避 '{' & '}' 與 '\'

這樣:"{(.*?)}"變成:"\\{(.*?)\\}"

,你必須逃離「\」另一個「\」第一

看到:http://www.regular-expressions.info/reference.html對於需要轉義字符的完整列表...

+0

這個伎倆!謝謝。我試圖逃脫,並總是得到一個編譯器錯誤,我只使用一個反斜槓。雙反斜槓的原因是什麼?這是原始錯誤:無效的轉義序列(有效的轉義序列是\ b \ t \ n \ f \ r \「\'\\) –

+0

,因爲您正在轉義轉義字符,以便將其轉換爲正則表達式編譯器,例如: '\ n'==新行,'\\'== \字符,正則表達式編譯器需要看到,因爲正則表達式不是Java中的第一類公民(它們使用JavaScript等其他語言),它們被編譯爲運行時,而不是編譯時間... – ckozl

+0

好吧,我看到你在編譯時所說的話,java認爲它只有一個字符串,因此「\\」得到「\」,然後在運行時它使用「\」正則表達式感謝您的幫助 –

7

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" 
0

{}正則表達式中具有特殊的意義,所以他們需要逃脫。

通常轉義是通過在字符前面加上反斜槓來實現的。在方括號中定義的字符類,你不應該需要做的

因此,像

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

可能接近你想要做

+2

您必須逃避'slash',因爲它是一個Java特殊字符 – gtgaxiola

3

您應該使用正向前查找什麼和反向預搜索:(?< = {)

(?<=\{)([^\}]+)(?=\}) 
  • 匹配一切後跟{
  • ([^}] +)匹配任何不包含的字符串}
  • (?= {)匹配之前的一切{
0

這完全適用於非嵌套括號,但對於像

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

[a-z]*[\{]+([a-zA-Z0-9]+)[\}]+作品的表達。