Java:replaceAll 不适用于反斜杠?

Posted

技术标签:

【中文标题】Java:replaceAll 不适用于反斜杠?【英文标题】:Java: replaceAll doesn't work well with backslash? 【发布时间】:2012-04-27 15:34:13 【问题描述】:

我正在尝试将带有反斜杠的字符串的开头替换为其他内容。 由于某些奇怪的原因,replaceAll 函数不喜欢反斜杠。

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

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

谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

它不喜欢它,因为\ 是类 C 语言中的转义字符(即使在本论坛上作为转义字符),这使得它成为文件分隔符的糟糕选择,但这是他们在 MS-DOS 中引入的更改...

你遇到的问题是你已经两次转义\,所以\\host\path在字符串中变成\\\\host\\path,但是对于正则表达式必须再次转义:P\\\\\\\\host\\\\path

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

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

【讨论】:

这是一个示例字符串。实际字符串是 Windows 共享路径,所以无法替换。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:
jarPath = jarPath.replaceAll("\\\\\\\\xyz\\\\abc", "z:");

对于字符串中的每个 '\',您应该将 '\\' 放入 replaceAll 方法中。

【讨论】:

对于答案中的每个'\',您应该将'\\' 放入mrkup。【参考方案7】:

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

【讨论】:

【参考方案8】:

您也可以使用replace() 方法,该方法将从String 中删除\\\\xyz\\abc

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

【讨论】:

【参考方案9】:

刚刚遇到类似的问题。

如果您在 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

希望对你有帮助!

【讨论】:

以上是关于Java:replaceAll 不适用于反斜杠?的主要内容,如果未能解决你的问题,请参考以下文章

java replaceAll /和\字符

java反斜杠替换

java replaceAll 不适用于 \n 字符

在java中用反斜杠转义空间

6.15

String类replaceAll方法正则替换深入分析