Java 中替换部分字符串的问题

Issue with replacing part of string in Java

我有一种方法可以将 sql 查询作为字符串读取,并且需要将所有“\”替换为“\\”。这样做是为了防止 \n 和 \r 在输出中被处理为换行符。

private static String cleanTokenForCsv(String inputToken) {
        if (inputToken == null) {
            return "";
        }
        if (inputToken.length() == 0 || inputToken.contains(",") || inputToken.contains("\"")
                || inputToken.contains("\n") || inputToken.contains("\r")) {
            String replacedToken = inputToken.replace(",", ";");
            return String.format("\"%s\"", replacedToken.replace("\"", "\"\""));
        } else {
            return inputToken;
        }
    }

示例输入

(\nSELECT\n a.population_id\n ,a.empi_id\n\r ,a.encounter_id\n ,SPLIT_PART(MIN(a.service_date|| '|'||a.norm_numeric_value),'|',2)::浮动为 earliest_temperature\nFROM\n ph_f_result a)

查询的预期输出将是

"(\nSELECT\n a.population_id\n ;a.empi_id\n\r ;a.encounter_id\n ;SPLIT_PART(MIN(a.service_date||'|'||a.norm_numeric_value);'|';2)::FLOAT as earliest_temperature\nFROM\n ph_f_result a)"

整个查询在一行中,换行符完好无损

然而,输出却是

"(
SELECT
    a.population_id
    ;a.empi_id

    ;a.encounter_id
    ;SPLIT_PART(MIN(a.service_date||'|'||a.norm_numeric_value);'|';2)::FLOAT as earliest_temperature
FROM
    ph_f_result a)"

我还尝试了以下方法:

replacedToken = replacedToken.replace("\", "\\");

使用正则表达式

replacedToken = replacedToken.replaceAll("\\", "\\\\");

编辑:所以如果我像下面这样为 \n 和 \r 添加单独的替换调用,我就可以让它工作

replacedToken = replacedToken.replace("\n","\n"); 
replacedToken = replacedToken.replace("\r", "\r");

但我正在为所有“\n”实例寻找更通用的东西

你有回车 return 和换行符,没有转义 r 或 n。

replacedToken = replacedToken.replace("\n", "\n").replace("\r", "\r");

这会将所有回车符 return 和换行符替换为其转义的等价物。

我假设您的目标只是将输入 String 中的字符 \r\t\n 转换为 double-quoted two-character strings "\r" 等等,以便打印字符串不会导致换行或制表符。

请注意 字符 \n 根本不包含 字符 \。我们只是同意写 \n 来表示它。这应该有效:

   public static String escapeWhitespaceEscapes(String input) {
       return input
           .replace("\n", "\n")
           .replace("\r", "\r")
           .replace("\t", "\t");
   }

但请注意,您必须执行反向操作才能取回原始字符串。