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 的方法。据我所知,两者都同样有效;它们之间可能存在性能差异(老实说,我希望 Brian 的性能更好)但是如果性能对您很重要,您应该测试这两种方法。

于 2013-03-29T20:42:09.117 回答