java - 如何转义回车符但跳过java中已经转义的字符

标签 java regex

这是输入字符串:

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

我想为远程访问转义“\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

有什么想法吗?

最佳答案

问题在于,在普通字符串中 \ 被转义为 \\ 并且在正则表达式中 转义反斜杠必须写为 \\\\。如果您有两个转义反斜杠...

    // 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似乎最清晰。两种解决方案都不计算连续的反斜杠,无论是奇数还是偶数都会有所不同。 但非正则表达式版本更安全,因为它会替换,然后在替换后继续。

关于java - 如何转义回车符但跳过java中已经转义的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58841427/

相关文章:

java - JHipster 持久化数据/访问数据库

java - 将代码片段添加到资源 - Gradle/Twitter API

regex - 部分字符串与新列中的匹配正则表达式匹配 - R

regex - 删除第一行或/(正则表达式)之后的内容

javascript - 正则表达式\n(换行)错误

regex - 正则表达式负前瞻

java - 使用 asList 的目的是什么?

java - 带有 tomcat 的 UrlRewrite 过滤器

java - 如何在JFrame中排列,升序,降序,冒泡,输入区域,输出区域

c# - 痛苦缓慢的正则表达式