[英]Regex to escape double quote in a Json Value in Java
我有一個 JSON 字符串,它可能在 JSON 值部分有未轉義的雙引號字符。 我試圖使用正則表達式捕獲它們並使用java.util.regex.Matcher
轉義,然后將完整的 JSON 字符串轉換為com.fasterxml.jackson.databind.node.ObjectNode
對象。 以便,
這變成:
{
"DESC1":"Steve"s and Carl"s " Car",
"DESC2": "Steve's and Carl"s Car",
"DESC3": """,
"DESC4": "Steve and Carl"
}
這個
{
"DESC1":"Steve\"s and Carl\"s \" Car",
"DESC2": "Steve's and Carl\"s Car",
"DESC3": "\"",
"DESC4": "Steve and Carl"
}
到目前為止,我能夠想到遵循正則表達式(我不是專家),但它並不是針對所有 3 種情況。
:\s*"(.*(").*)"
如何改進這個正則表達式?
對於示例數據,您可以匹配鍵部分,並在值部分使用\\G
來獲取重復匹配,以斷言前一個匹配結束時的位置。
為了確保至少有一個開始和結束的花括號,您可以使用環視。 Java 不支持無限回溯,但通過為量詞指定一個數字來支持有限回溯。
在此示例中,我選擇了{0,1000}
但您當然可以根據需要更改它。
(?<=\\{[^\\{}]{0,1000})("[^\r\n"{}]+":\s*"|\G(?!^))([^"\r\n{}]*)(")(?=[^{}]*})(?!\s*(?:,|$))
在 Java 中
final String regex = "(?<=\\{[^\\{}]{0,1000})(\"[^\\r\\n\"\\{}]+\":\\s*\"|\\G(?!^))([^\"\\r\\n\\{}]*)(\")(?=[^\\{}]*\\})(?!\\s*(?:,|$))";
在替換中使用 3 個捕獲組:
String subst = "$1$2\\\\$3";
圖案零件
(?<=
有限正向后視,斷言左邊的是
{[^{}]{0,1000}
匹配{
后跟 0 - 1000 次不是{
或}
)
關閉后視(
捕獲組 1
"[^\\r\\n"{}]+"
匹配"
, 1+ 任何字符,除了字符類中的字符:\\s*"
匹配:
, 0+ 空格字符|
或者\\G(?!^)
在上一場比賽結束時斷言位置)
關閉群組([^"\\r\\n{}]*)
捕獲組 2 ,匹配除所列字符以外的任何字符 0+ 次(")
捕獲第 3 組,匹配"
(?=
正向前瞻,斷言右邊是
[^{}]*}
匹配 0+ 次除列出的字符之外的任何字符,然后匹配}
)
關閉前瞻(?!
負前瞻,斷言右邊的不是
\\s*(?:,|$)
匹配 0+ 次空白字符,然后匹配,
或字符串的結尾)
關閉前瞻結果
{
"DESC1":"Steve\"s and Carl\"s \" Car",
"DESC2": "Steve's and Carl\"s Car",
"DESC3": "\"",
"DESC4": "Steve and Carl"
}
如果這個值字符串;
str = str.replaceAll("\/","");
使“/”變成“”(空)。
或者
try {
FileReader reader = new FileReader("JSON file path");
JSONParser jsonParser = new JSONParser();
String jsonString = jsonParser.parse(reader).toString();
} catch (Exception e) {
e.printStackTrace();
}
對於 JSONParser
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.