Экранирование неправильных обратных косых черт в строке

#java #json #regex

#java #json #регулярное выражение

Вопрос:

У меня в базе данных есть строка JSON, подобная этой:

 {"name" : "DROCK", "details" : [{"age" : "23", "degree" : "BE", "Experience" : "worked in a company6as an intern"}]}
  

Я хочу удалить символ , но который не является допустимой escape-строкой. Я пытался использовать StringEscapeUtil, но здесь это мне не помогает.

Код, который я использовал здесь:

 import org.apache.commons.lang.xwork.StringEscapeUtils;

public class JSONEscape {
    public static void main(String args[]) {
        String testString = "{"name" : "DROCK", "details" : [{"age" : "23", "degree" : "BE", "Experience" : "worked in a company6as an intern"}]}";
        System.out.println(StringEscapeUtils.escapeJava(testString));
    }
}
  

Как я должен экранировать допустимые символы и удалять неправильные символы, подобные этому. но я хотел бы сохранить допустимые escape-символы, такие как n, t и т.д.

Наконец, я хотел бы получить такой результат:

 {"name" : "DROCK", "details" : [{"age" : "23", "degree" : "BE", "Experience" : "worked in a company6as an intern"}]}
  

Ответ №1:

Если вы хотите удалить неправильные escape-последовательности в строке JSON, то это просто.

 String testString = "{"name" : "DROCK", "details" : ["age" : "23", "degree" : "BE", "Experience" : "worked in a company\6as an intern"]}";
System.out.println(testString.replaceAll("\([^bfnrt"\])", "$1"));
  

Это регулярное выражение буквально означает «везде, где за обратной косой чертой следует недопустимый escape-символ, отбрасывайте обратную косую черту».

Комментарии:

1. Спасибо @Leo Aso за ваш ответ, я изменил строку замены следующим образом: System.out.println(testString.replaceAll(«\[^bfnrt»‘\]», «$1»)); Теперь я вижу? вместо 6 в SOP 🙁

2. Убедитесь, что в вашей тестовой строке вы вводите \6 не 6 . Если вы вводите JSON непосредственно в строке, вам нужно написать обратную косую черту дважды, потому что Java распознает 6 как escape-последовательность, равную u0006 , но если вы введете \6 , она просто оставит ее как 6 .