1

複数行のテキストを解析したいので、次のように書きました。

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 の助けを借りても、それを解決することはできません。

4

2 に答える 2

4

正規表現で貪欲な量指定子を使用しました。したがって、.*in[(.*)]は最後に見つかったものまですべてを消費します]。消極的な量指定子を使用する必要があります。?の後に を追加し.*ます。

また、最後の については、.*先読みを使用して、次の の前に停止させる必要があります[

次のコードが機能します。

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 で最後の 2 行をキャプチャするために必要です。[$$

出力:

G1: timestamp1
G2: INFO
G3: Message1 


G1: timestamp2
G2: ERROR
G3: Message2 


G1: timestamp3
G2: INFO
G3: Message3 
Message3_details1......... 
Message3_details2 ......... 
于 2013-10-07T10:39:41.567 に答える
0

試す"\\[(.*?)\\] (.*?) - (.*?) \\r\\n"

于 2013-10-07T10:52:51.600 に答える