Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java::使用正则表达式解析多行文本_Java_Regex - Fatal编程技术网

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是的,它将停止在那里。在在这种情况下,您必须稍微修改前瞻性。