Java::使用正则表达式解析多行文本
我想解析一个多行文本,所以我写了如下内容:Java::使用正则表达式解析多行文本,java,regex,Java,Regex,我想解析一个多行文本,所以我写了如下内容: String text = "[timestamp1] INFO - Message1 \r\n" + "[timestamp2] ERROR - Message2 \r\n" + "[timestamp3] INFO - Message3 \r\n" + "Message3_details1......... \r\n" + "Message3_detai
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] INFO - Message1
[timestamp2] ERROR - Message2
[timestamp3
G2: INFO
G3: Message3
Message3_details1........
Message3_details2........
我想得到的是:
G1: timestamp1
G2: INFO
G3: message1
G1: timestamp2
G2: ERROR
G3: message2
G1: timestamp3
G2: INFO
G3: message3
message_details1....
message_details2...
但我得到的是这样的:
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] INFO - Message1
[timestamp2] ERROR - Message2
[timestamp3
G2: INFO
G3: Message3
Message3_details1........
Message3_details2........
即使有谷歌的帮助,我也无法解决这个问题。您在正则表达式中使用了贪婪量词。因此,
[(.*)]
中的*
将消耗所有东西,直到最后一次找到]
。你需要使用不情愿的量词。在*
之后添加?
另外,对于最后一个*
,您需要使用前瞻,使其在下一个[
之前停止
以下代码将起作用:
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 .........
您在正则表达式中使用了贪婪的量词。因此,
[(.*)]
中的*
将消耗所有内容,直到最后找到]
。您需要使用不情愿的量词。在*
之后添加一个?
另外,对于最后一个*
,您需要使用前瞻,使其在下一个[
之前停止
以下代码将起作用:
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 .........
请尝试
“\\[(.*?\\](.*?)-(.*?)\\r\\n”
尝试“\\[(.*?\\](.*?)-(.*?\\r\\n”
非常感谢。但是如果Message3\u datails包含方括号中的文本,该怎么办?它将停止在方括号中。@yataodev是的,它将停止在那里。在这种情况下,您必须稍微修改一下“向前看”。非常感谢。但是如果Message3\u datails包含方括号中的文本,该怎么办?它将停止在方括号中。@yataodev是的,它将停止在那里。在在这种情况下,您必须稍微修改前瞻性。