[英]Java fix regex in code
我需要打印@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” ,如何修复我的图案?
您可能需要以下内容:
Pattern pattern = Pattern.compile("\"MSG2\":\"([^\"]+)\"");
对于您感兴趣的捕获组,它将匹配除双引号之外的任何字符。 由于该组被双引号引起来,因此应防止其在比赛中“走得太远”。
编辑添加 :如评论中@ bmorris591所建议,您可以添加一个额外的+
(如下所示)以使量词所有格 。 如果匹配器找不到匹配项,这可能有助于提高性能。
Pattern pattern = Pattern.compile("\"MSG2\":\"([^\"]++)\"");
您想让您的.+
部分不愿使用 。 默认情况下,它是贪婪的-它会尽可能地匹配,而不会阻止模式匹配。 你想让它尽可能少的 ,因为它可以,符合这样的:
Pattern pattern = Pattern.compile(".*\"MSG2\":\"(.+?)\".*");
?
是什么让它不愿意。 有关更多详细信息,请参见Pattern
文档。
或者,当然,您可以将其与“除了双引号之外的任何字符”匹配,这就是Brian的方法所要做的。 据我所知,两者都将同样有效。 它们之间可能存在性能差异(老实说,我希望Brian的性能更好),但是如果性能对您很重要,则应该测试两种方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.