有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

代码中的Java修复正则表达式

我需要打印@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相反,我如何修复我的模式


共 (2) 个答案

  1. # 1 楼答案

    您可能需要以下内容:

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

    对于您感兴趣的捕获组,这将匹配除双引号以外的任何字符。由于小组被双引号包围,这应该可以防止小组在比赛中“走得太远”

    编辑以添加:正如@bmorris591在评论中建议的那样,您可以添加额外的+(如下所示)以使量词possessive。这可能有助于在匹配器无法找到匹配项的情况下提高性能

    Pattern pattern = Pattern.compile("\"MSG2\":\"([^\"]++)\"");
    
  2. # 2 楼答案

    你想让你的.+部分不情愿。默认情况下,它是贪婪的-它将尽可能多地匹配,而不会阻止模式匹配。您希望它尽可能匹配为,如下所示:

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

    正是?让它不情愿。有关更多详细信息,请参阅^{}文档

    当然,你也可以与“除了双引号以外的任何角色”进行匹配,这就是布赖恩的方法。据我所知,这两种方法都同样有效;它们之间很可能存在性能差异(老实说,我希望Brian的表现更好),但如果性能对您很重要,您应该测试这两种方法