Java:replaceAll与反斜杠不兼容?

时间:2012-04-16 09:45:13

标签: java regex replaceall

我正在尝试用反斜杠替换字符串的开头。 由于一些奇怪的原因,replaceAll函数不喜欢反斜杠。

String jarPath = "\\\\xyz\\abc\\wtf\\lame\\";
jarPath = jarPath.replaceAll("\\\\xyz\\abc", "z:");

我该怎么做才能解决这个问题。

谢谢。

9 个答案:

答案 0 :(得分:3)

您需要将每个反斜杠加倍(再次),因为replaceAll()使用的Pattern类将其视为特殊字符:

String jarPath = "\\\\xyz\\abc\\wtf\\lame\\";
jarPath = jarPath.replaceAll("\\\\\\\\xyz\\\\abc", "z:");

Java字符串将反斜杠视为转义字符,因此replaceAll看到的是:\\\\xyz\\abc。但replaceAll也将反斜杠视为转义字符,因此正则表达式变为字符:\ \ x y z \ {{1 }} a b

答案 1 :(得分:3)

它不喜欢它,因为\是C语言中的转义字符(即使是在这个论坛上的转义)这使得它成为文件分隔符的不良选择,但它在MS中引入了它的变化-DOS ...

您遇到的问题是,您已经\两次转义,因此\\host\path变为\\\\host\\path字符串,但必须再次转义正则表达式:P \\\\\\\\host\\\\path

如果你可以使用正斜杠,那就更简单了

String jarPath = "//xyz/abc/wtf/lame/";
jarPath = jarPath.replaceAll("//xyz/abc", "z:");

答案 2 :(得分:2)

replaceAll()使用使用反斜杠作为转义字符的正则表达式。此外,Java String语法还使用反斜杠作为转义字符。这意味着你需要将所有反斜杠加倍才能得到你想要的东西:

String jarPath = "\\\\xyz\\abc\\wtf\\lame\\";
jarPath = jarPath.replaceAll("\\\\\\\\xyz\\\\abc", "z:");

答案 3 :(得分:2)

replaceAll期望一个正则表达式作为其输入字符串,然后在每个实例中进行匹配和替换。反斜杠是正则表达式中的特殊转义字符,为了匹配它,您需要另一个反斜杠来转义它。因此,要将字符串与"\"匹配,您需要一个带有“”\“`的正则表达式。

要匹配字符串"\\\\xyz\\abc",您需要使用正则表达式"\\\\\\\\xyz\\\\abc"(请为每个来源\注意额外的\):

String jarPath = "\\\\xyz\\abc\\wtf\\lame\\";
jarPath = jarPath.replaceAll("\\\\\\\\xyz\\\\abc", "z:");

答案 4 :(得分:1)

jarPath = jarPath.replaceAll("\\\\\\\\xyz\\\\abc", "z:");

对于字符串中的每个'\',您应该在replaceAll方法中添加'\\'。

答案 5 :(得分:1)

replaceAll方法使用正则表达式,这意味着您必须转义斜杠。在您的情况下,使用String.replace可能是有意义的:

String jarPath = "\\\\xyz\\abc\\wtf\\lame\\";
jarPath = jarPath.replace("\\\\xyz\\abc", "z:");

答案 6 :(得分:0)

您可以在用例中使用replace方法而不是replaceAll。如果我没弄错的话,它不会使用正则表达式。

答案 7 :(得分:0)

您也可以使用replace()方法删除\\\\xyz\\abc

中的String
String jarPath = "\\\\xyz\\abc\\wtf\\lame\\";
jarPath = jarPath.replace("\\\\xyz\\abc", "z:");

答案 8 :(得分:0)

刚遇到类似的问题。

如果在replaceAll函数的第二部分中使用反斜杠(),则反斜杠会消失,为避免这种情况,可以使用Matcher类。

String assetPath="\Media Database\otherfolder\anotherdeepfolder\finalfolder";

String assetRemovedPath=assetPath.replaceAll("\\\\Media Database(.*)", Matcher.quoteReplacement("\\Media Database\\_ExpiredAssets")+"$1");

system.out.println("ModifiedPath:"+assetRemovedPath);

打印:

\Media Database\_ExpiredAssets\otherfolder\anotherdeepfolder\finalfolder
希望它有所帮助!