3

私は、次のような行を解析する必要があるログ パーサーに取り組んでいます。

ID1 : 0     ID2 : 214 TYPE : ERROR      DATE : 2012-01-11 14:08:07.432 CLASS : Maintenance    SUBCLASS : Operations

ID1、ID2、TYPE、DATE、CLASS、および SUBCLASS はすべてキーワードであり、次のようなものが必要です。

ID1 : 0  
ID2 : 214  
TYPE : ERROR  
DATE : 2012-01-11 14:08:07.432  
CLASS : Maintenance  
SUBCLASS : Operations

私は正規表現に本当に慣れていないので、次のものを持っています:

(ID1|ID2|TYPE|DATE|CLASS|SUBCLASS)\\s*:\\s*(.+?)\\s*[(ID1|ID2|TYPE|DATE|CLASS|SUBCLASS)]

もちろん、うまくいきません。

どんなアドバイスでも大歓迎です。

4

5 に答える 5

3

あなたの式の主な問題は角括弧です。それらは文字クラスを作成します。これは、内部の文字から正確に 1 文字に一致します。

(ID1|ID2|TYPE|DATE|CLASS|SUBCLASS)\\s*:\\s*(.+?)\\s*[(ID1|ID2|TYPE|DATE|CLASS|SUBCLASS)]
                                                    ^                                  ^

最後の代替も肯定的な先読みアサーション( で始まるグループ?=) にしたので、これは一致しません。これらの代替の 1 つが先行していることを確認しただけです。$文字列の最後にも交互に追加しました。

(ID1|ID2|TYPE|DATE|CLASS|SUBCLASS)\\s*:\\s*(.+?)\\s*(?=ID1|ID2|TYPE|DATE|CLASS|SUBCLASS|$)

正規表現をテストするための優れたツールであるRegexr のこちらを参照してください。

于 2012-03-20T09:08:51.710 に答える
1

これを試すことができます:

        String s = "ID1 : 0     ID2 : 214 TYPE : ERROR      DATE : 2012-01-11 14:08:07.432 CLASS : Maintenance    SUBCLASS : Operations";  
        Pattern pattern = Pattern.compile("(ID1 :\\s+\\d+|ID2 :\\s+\\d+|TYPE :\\s+\\w+|DATE :\\s+\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}\\.\\d{3}|CLASS :\\s+\\w+|SUBCLASS :\\s+\\w+)");  
        Matcher matcher = pattern.matcher(s); 
        String res="";
        while(matcher.find()){
            res+=matcher.group(0)+System.getProperty("line.separator");
        }
        System.out.println(res);

ID と ID2 は数字だけで、TYPE、CLASS、SUBCLASS は単語だと思います。

出力

ID1:0

ID2 : 214

タイプ: エラー

日付: 2012-01-11 14:08:07.432

クラス : メンテナンス

サブクラス : 操作

于 2012-03-20T09:09:38.217 に答える
0
StringBuffer s = new StringBuffer("ID1 : 0     ID2 : 214 TYPE : ERROR      DATE : 2012-01-11 14:08:07.432 CLASS : Maintenance    SUBCLASS : Operations");
int i = s.indexOf("ID2");
s.insert(i, "\n");
i = s.indexOf("TYPE");
s.insert(i, "\n");
    //............The rest code for other keywords

注:これは私が知っている一時的な解決策にすぎません。より効率的なロジックがあるかもしれません。

于 2012-03-20T09:01:42.787 に答える
0

おそらく、次のような正規表現を使用できます: "(\w*)\s\:\s([\w\.\-\,] )\s " そして、このようにパターンマッチャーを使用します:

 Pattern p = Pattern.compile("(\\w*)\\s\\:\\s([\\w\\.\\-\\,]*)\\s*");
 Matcher matcher = pattern.matcher(s); 

 while(matcher.find()){
     //your couple "properties + : + value"
     System.out.println( matcher.group(0) );
     //your properties
     System.out.println( matcher.group(1) );
     //your value
     System.out.println( matcher.group(2) );
 }
于 2012-03-20T09:13:48.363 に答える
0
public static String format(String line) {
    return
    line.replaceFirst("ID2", "\nID2")
    .replaceFirst("ID1", "\nID1")
    .replaceFirst("TYPE", "\nTYPE")
    .replaceFirst("DATE", "\nDATE")
    .replaceFirst("CLASS", "\nCLASS")
    .replaceFirst("SUBCLASS", "\nSUBCLASS");
}
于 2012-03-20T09:15:52.030 に答える