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 也将反斜杠视为转义字符,因此正则表达式变为字符:\
\
x
y
z
\
\
a
b
c
【讨论】:
【参考方案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 不适用于反斜杠?的主要内容,如果未能解决你的问题,请参考以下文章