Java ::使用正则表达式解析多行文本

时间:2013-10-07 10:36:04

标签: java regex

我想解析一个多行文本,所以我写了这样的东西:

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........

即使有谷歌的帮助,我也无法解决这个问题。

2 个答案:

答案 0 :(得分:4)

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

此外,对于上一个.*,您需要使用前瞻,以使其在下一个[之前停止。

以下代码可行:

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();
}

正则表达式的最后一部分 - (.*?)(?=\\[|$)匹配下一行[之前的所有内容,或直到结尾($)。在最后一场比赛的第3组中,最后两行需要$

<强>输出:

G1: timestamp1
G2: INFO
G3: Message1 


G1: timestamp2
G2: ERROR
G3: Message2 


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

答案 1 :(得分:0)

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