我的應用程式中有一些功能應該替換 json 中的一些文本(我在示例中對其進行了簡化)。它們的替換可能包含轉義序列\n \b \t等,當我嘗試使用 Jackson 構建 json 時,它們可能會破壞 json 字串。所以我決定使用 Apache 的解決方案——StringEscapeUtils.escapeJava()轉義所有轉義序列。但
Matcher.replaceAll()洗掉由添加的反斜杠escapeJava()
有代碼:
public static void main(String[] args) {
String json = "{\"test2\": \"Hello toReplace \\\"test\\\" world\"}";
String replacedJson = Pattern.compile("toReplace")
.matcher(json)
.replaceAll(StringEscapeUtils.escapeJava("replacement \n \b \t"));
System.out.println(replacedJson);
}
預期輸出:
{"test2": "Hello replacement \n \b \t \"test\" world"}
實際輸出:
{"test2": "Hello replacement n b t \"test\" world"}
為什么在回傳正確輸出Matcher.replaceAll()的同時洗掉反斜杠-System.out.println(StringEscapeUtils.escapeJava("replacement \n \b \t"));replacement \n \b \t
uj5u.com熱心網友回復:
StringEscapeUtils.escapeJava("\n")允許您將單個換行符\n轉換為兩個字符:\和n.
\是模式替換中的一個特殊字符,來自https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#replaceAll(java.lang.String):
請注意,替換字串中的反斜杠 (
\) 和美元符號 ($) 可能會導致結果與將其視為文字替換字串時的結果不同。如上所述,美元符號可以被視為對捕獲的子序列的參考,并且反斜杠用于轉義替換字串中的文字字符。
要將它們作為文字字符,您需要通過Matcher.quoteReplacementhttps://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#quoteReplacement(java.lang .字串):
String回傳指定的文字替換String。此方法生成一個String將用作類方法中的s文字替換。生成的將匹配被視為文字序列的字符序列。斜杠 ( ) 和美元符號 ( ) 沒有特殊含義。appendReplacementMatcherStrings\$
所以在你的情況下:
.replaceAll(Matcher.quoteReplacement(StringEscapeUtils.escapeJava("replacement \n \b \t")))
uj5u.com熱心網友回復:
如果您想在 中使用文字反斜杠replaceAll,則需要對其進行轉義。您可以在此處的檔案中找到它
StringEscapeUtils.escapeJava 將轉義適合在 Java 源代碼中使用的字串 - 但它不允許您在源代碼中使用未轉義的字串。
"replacement \n \b \t"
^ new line
^ backspace
^ tab
如果您想在常規 Java 字串中使用文字反斜杠,您需要:
"replacement \\n \\b \\t"
因為這是正則運算式替換部分的 java 字串,所以replaceAll您需要:
"replacement \\\\n \\\\b \\\\t"
嘗試:
String replacedJson = Pattern.compile("toReplace")
.matcher(json)
.replaceAll("replacement \\\\n \\\\b \\\\t")
uj5u.com熱心網友回復:
您還必須\使用Matcher.quoteReplacement().
public static String replaceAll(String json, String regex, String replace) {
return Pattern.compile(regex)
.matcher(json)
.replaceAll(Matcher.quoteReplacement(StringEscapeUtils.escapeJava(replace)));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/418886.html
標籤:
