0

改行を含む文字列のパターンを一致させるにはどうすればよいですか? 例えば

requisition({"title":"my json",
             "items" : [{ "A": "a",
                          "B": "b"}
                       ]
            })

これだけ捕まえたい

{"title":"my json",
             "items" : [{ "A": "a",
                          "B": "b"}
                       ]
}

私は何かを試しました

String pattern = ".*(\\{.*\\}).*";
Pattern r = Pattern.compile(pattern, Pattern.DOTALL);

しかし、成功しません。何か提案はありますか?

より明確にするために。これは私の入力です

4

1 に答える 1

1

入力としての単一の JSON オブジェクトの問題は単純です。最初.*は貪欲です。{そのため、 .が続く最後のものまですべてを消費します}。貪欲でない (または除外した)場合.*は、完全な JSON オブジェクトを取得する必要があります。

String pattern = ".*?(\\{.*\\}).*";

しかし、最初と最後の繰り返しを完全に除外することができます (またそうすべきです):

String pattern = "\\{.*\\}";

その後、何もキャプチャする必要さえありません。findこれはの代わりに使用する必要があることに注意してくださいmatches

ただし、入力には複数の JSON オブジェクトがあります。そして、ここで正規表現の問題が発生します。一部のエンジンは、ブラケットの正しいネストを可能にする構造をサポートしています (どのブラケットが実際に一緒に属しているかを確認するため)。しかし、これらの正規表現は簡単に見苦しく、維持できなくなります。

文字列を手動でウォークし、現在のネスト レベルをカウントしておく方がよいでしょう。トップレベルに戻るときはいつでも、部分文字列を切り取るだけです (対応する開始ブラケットから現在の位置まで)。

于 2012-11-26T21:46:45.007 に答える