0

@OPOKを出力する必要がありますが、次のコードで:

String s = "\"MSG1\":\"00\",\"MSG2\":\"@OPOK\",\"MSG3\":\"XXXXXX\"}";

Pattern pattern = Pattern.compile(".*\"MSG2\":\"(.+)\".*");
Matcher matcher = pattern.matcher(s);

if (matcher.find()) {
    System.out.println(matcher.group(1));
} else {
    System.out.println("Match not found");
}

代わりに@OPOK","MSG3":"XXXXXXが表示されます。パターンを修正するにはどうすればよいですか?

4

2 に答える 2

2

おそらく次のものが必要です。

Pattern pattern = Pattern.compile("\"MSG2\":\"([^\"]+)\"");

関心のあるキャプチャ グループの場合、これは二重引用符を除く任意の文字と一致します。グループは二重引用符で囲まれているため、一致で「行き過ぎ」ないようにする必要があります。

追加するように編集: @ bmorris591 がコメントで提案したように、+(以下に示すように) エクストラを追加して、量指定子を所有格にすることができます。これにより、マッチャーが一致を見つけられなかった場合のパフォーマンスが向上する可能性があります。

Pattern pattern = Pattern.compile("\"MSG2\":\"([^\"]++)\"");
于 2013-03-29T20:42:04.913 に答える
2

.+自分のパートを渋らせたい。デフォルトでは貪欲です - パターンの一致を妨げずに、可能な限り一致します。次のように、できるだけ一致しないようにします。

Pattern pattern = Pattern.compile(".*\"MSG2\":\"(.+?)\".*");

それ?が気が進まない理由です。詳細については、Patternドキュメントを参照してください。

またはもちろん、ブライアンのアプローチが行う「二重引用符以外の任意の文字」と照合することもできます。私が知る限り、どちらも同じように機能します。それらの間にパフォーマンスの違いがあるかもしれません(正直に言うと、Brian の方がパフォーマンスが良いと思います) が、パフォーマンスが重要な場合は、両方のアプローチをテストする必要があります。

于 2013-03-29T20:42:09.117 に答える