字符串forwardslash被替换

时间:2017-04-13 10:06:07

标签: java regex string

我有以下代码

String outputStr = "-XX:-HeapDumpOnOutOfMemoryError -XX:MaxPermSize=64m -Xms24m -Dcom.sun.management.jmxremote.password.file=\"E:Java\\jmx-management\\jmxremote.password\" -Djava.awt.headless=true";

outputStr.replaceAll("-Dcom.sun.management.jmxremote.password.file=[\"\\w\\=\\.\\!\\#\\$\\%\\&\\*\\+\\-\\~\\:\\;\\,\\@\\|\\\\\\/]+",
    "-Dcom.sun.management.jmxremote.password.file=\"E:\\Java\\jmx-management\\jmxremote.password\"");

它正在给我

-XX:-HeapDumpOnOutOfMemoryError -XX:MaxPermSize=64m -Xms24m -Dcom.sun.management.jmxremote.password.file="E:Javajmx-managementjmxremote.password" -Djava.awt.headless=true

我想要这个

-XX:-HeapDumpOnOutOfMemoryError -XX:MaxPermSize=64m -Xms24m -Dcom.sun.management.jmxremote.password.file="E:\Java\jmx-management\jmxremote.password" -Djava.awt.headless=true

不改变替换

"-Dcom.sun.management.jmxremote.password.file=\"E:\\Java\\jmx-management\\jmxremote.password\""

2 个答案:

答案 0 :(得分:1)

String outputStr = "-XX:-HeapDumpOnOutOfMemoryError -XX:MaxPermSize=64m -Xms24m -Dcom.sun.management.jmxremote.password.file=\"E:Java\\jmx-management\\jmxremote.password\" -Djava.awt.headless=true";
outputStr = outputStr.replace("\\\\", "\\");

答案 1 :(得分:0)

正则表达式中的主要问题是您需要在Java替换字符串文字中使用4个反斜杠来替换1个字面反斜杠。但是,还有一些我想评论的小事:

  • overescaping - 角色类中的大多数字符都可以保留未转义状态,因为它们几乎都被视为字符类中的文字字符,
  • 您要保留的模式部分可以捕获,并且可以在替换模式中使用对它的反向引用,使其更短,
  • 必须在字符类之外转义点以表示文字点。

请参阅Java demo

String outputStr = "-XX:-HeapDumpOnOutOfMemoryError -XX:MaxPermSize=64m -Xms24m -Dcom.sun.management.jmxremote.password.file=\"E:Java\\jmx-management\\jmxremote.password\" -Djava.awt.headless=true";
outputStr = outputStr.replaceAll("(-Dcom\\.sun\\.management\\.jmxremote\\.password\\.file=)[-\"\\w=.!#$%&*+~:;,@|\\\\/]+",
    "$1\"E:\\\\Java\\\\jmx-management\\\\jmxremote.password\"");
System.out.println(outputStr);
// => -XX:-HeapDumpOnOutOfMemoryError -XX:MaxPermSize=64m -Xms24m -Dcom.sun.management.jmxremote.password.file="E:\Java\jmx-management\jmxremote.password" -Djava.awt.headless=true