[英]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.