19

ログファイルを解析して、時刻と関連する関数呼び出し文字列を取得する必要があります。これは次のようにログファイルに保存されます。{"time": "2012-09-24T03:08:50"、 "message": "Call( )開始しました "}

他の文字列文字の間に複数のログに記録された時間関数呼び出しがあるため、正規表現を使用してファイルを調べ、これらすべてを取得したいと考えています。

中括弧を含むログ情報全体を取得したい

私は以下を試しました

Pattern logEntry = Pattern.compile("{(.*?)}");
Matcher matchPattern = logEntry.matcher(file);

Pattern.compile("{[^{}]*}");
Matcher matchPattern = logEntry.matcher(file);

違法な繰り返しエラーが発生し続けます。助けてください!ありがとう。

4

5 に答える 5

38

「\」で「{」と「}」をエスケープする必要があります

そう:"{(.*?)}"なる:"\\{(.*?)\\}"

最初に別の「\」で「\」をエスケープする必要がある場所

エスケープが必要な文字の包括的なリストについては、http://www.regular-expressions.info/reference.htmlを参照してください...

于 2012-09-25T15:28:15.160 に答える
9

Bracesは繰り返しグループに使用される特殊な正規表現文字であるため、エスケープする必要があります。

Pattern logEntry = Pattern.compile("\\{(.*?)\\}");

簡単なテスター:

 public static void main(String[] args) throws Exception {
        String x =  "{\"time\" : \"2012-09-24T03:08:50\", \"message\" : \"Call() started\"}";
        Pattern logEntry = Pattern.compile("\\{(.*?)\\}");
        Matcher matchPattern = logEntry.matcher(x);

        while(matchPattern.find()) {
            System.out.println(matchPattern.group(1));
        }

    }

私に与えます:

"time" : "2012-09-24T03:08:50", "message" : "Call() started"
于 2012-09-25T15:27:18.370 に答える
0

これは、ネストされていないブラケットに対しては完全に機能しますが、次のような式に対しては機能します

(sum(x) * 100) / (sum(y) + sum(z))

[a-z]*[\{]+([a-zA-Z0-9]+)[\}]+動作します。

于 2016-03-02T05:51:21.683 に答える
0

正規表現の {} には特別な意味があるため、エスケープする必要があります。

通常、エスケープは、エスケープする文字の前にバックスラッシュを付けることによって実現されます。角括弧で定義された文字クラスでは、これを行う必要はありません

だから何か

Pattern.compile("\{[^{}]*\}");

やりたいことにもっと近づけるかもしれません

于 2012-09-25T15:29:41.317 に答える