簡體   English   中英

正則表達式在 Java 中的 Json 值中轉義雙引號

[英]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";

Java 演示

圖案零件

  • (?<=有限正向后視,斷言左邊的是
    • {[^{}]{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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM