2013-10-07 49 views
0

我想分析多行文本多行文本,所以我写了这样的事情:的Java ::解析正则表达式

String text = "[timestamp1] INFO - Message1 \r\n" 
      + "[timestamp2] ERROR - Message2 \r\n" 
      + "[timestamp3] INFO - Message3 \r\n" 
      + "Message3_details1......... \r\n" 
      + "Message3_details2 ......... \r\n"; 
String regex = "\\[(.*)\\] (.*) - (.*)"; 
Pattern p = Pattern.compile(regex, Pattern.DOTALL); 
Matcher m = p.matcher(text); 
while (m.find()) { 
    System.out.println("G1: " + m.group(1)); 
    System.out.println("G2: " + m.group(2)); 
    System.out.println("G3: " + m.group(3)); 
    System.out.println(); 
} 

我想是这样的:

G1: timestamp1 
G2: INFO 
G3: message1 

G1: timestamp2 
G2: ERROR 
G3: message2 

G1: timestamp3 
G2: INFO 
G3: message3 
    message_details1.... 
    message_details2... 

但我得到的是这样的:

G1: timestamp1] INFO - Message1 
    [timestamp2] ERROR - Message2 
    [timestamp3 
G2: INFO 
G3: Message3 
    Message3_details1........ 
    Message3_details2........ 

即使在Google的帮助下,我也无法解决这个问题。

回答

3

你在你的正则表达式中使用了贪婪量词。因此,.*[(.*)]将消耗一切,直到最后找到]。你需要使用不情愿的量词。在.*之后添加?

另外,对于最后的.*,您需要使用预见性,使其在下一个[之前停止。

下面的代码将工作:

String text = "[timestamp1] INFO - Message1 \r\n" 
      + "[timestamp2] ERROR - Message2 \r\n" 
      + "[timestamp3] INFO - Message3 \r\n" 
      + "Message3_details1......... \r\n" 
      + "Message3_details2 ......... \r\n"; 

String regex = "\\[(.*?)\\] (.*?) - (.*?)(?=\\[|$)"; 

Pattern p = Pattern.compile(regex, Pattern.DOTALL); 
Matcher m = p.matcher(text); 
while (m.find()) { 
    System.out.println("G1: " + m.group(1)); 
    System.out.println("G2: " + m.group(2)); 
    System.out.println("G3: " + m.group(3)); 
    System.out.println(); 
} 

正则表达式的最后一部分 - (.*?)(?=\\[|$)匹配的下一行的一切,直到[,或直到结束($)。 $是最后两场比赛中最后两场比赛的最后一场比赛。

输出:

G1: timestamp1 
G2: INFO 
G3: Message1 


G1: timestamp2 
G2: ERROR 
G3: Message2 


G1: timestamp3 
G2: INFO 
G3: Message3 
Message3_details1......... 
Message3_details2 ......... 
+0

非常感谢。 但是,如果Message3_datails在方括号中包含文本会怎么样?它会停下来。 – yataodev

+0

@yataodev是的,它会停在那里。在这种情况下,您将不得不稍微修改前瞻。 –

0

尝试"\\[(.*?)\\] (.*?) - (.*?) \\r\\n"