我想解析一个多行文本,所以我写了这样的东西:
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........
即使有谷歌的帮助,我也无法解决这个问题。
答案 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"