首页 > 解决方案 > 如何转义回车但跳过java中已经转义的字符

问题描述

这是输入字符串:

"\"C:\\Users\\Administrator\\ram\\Microsoft\\19.070.0410.0007\remoteAccess.dll\""

我想为 remoteAccess 转义 '\r' 但将一个单独留在 \ram 中,因此结果应如下所示:

"\"C:\\Users\\Administrator\\ram\\Microsoft\\19.070.0410.0007\\remoteAccess.dll\""

我试过StringEscapeUtils了,但它只是逃避了一切。负后视似乎在 java 中不起作用:

String sub = resp.replaceAll("(?<!\\)\\r", "\\\\r");

生产

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 8
(?<!\)\r

有任何想法吗?

标签: javaregex

解决方案


问题是,在普通字符串\中转义为\\,而在正则表达式中,转义的反斜杠必须写为\\\\. 如果你有两个转义的反斜杠......

    // String as in java source: \\ is actualy a \, \" actually a ".
    String resp = "\"\\\"C:\\\\Users\\\\Administrator\\\\ram\\\\Microsoft\\\\"
            + "19.070.0410.0007\\remoteAccess.dll\\\"\"";
    System.out.println(resp); // The input as you did show.

    // Regex solution:
    String sub = resp.replaceAll("(?<!\\\\)\\\\r", "\\\\\\\\r");
    String sub = resp.replaceAll("(?<!\\\\)\\\\(\\w)", "\\\\\\\\$1");
    System.out.println(sub);

    // Simple string replace:
    String sub2 = resp.replace("\\\\", "\\").replace("\\", "\\\\");
    sub2 = sub2.replace("\\\\\"", "\\\""); // Undo for \"
    System.out.println(sub2);

非正则表达式的简单字符串replace似乎最清晰。两种解决方案都不计算连续的反斜杠,无论是奇数还是偶数都会有所不同。但是非正则表达式版本更安全,因为它会替换,然后在替换继续。


推荐阅读