我正在尝试用反斜杠将字符串的开头替换为其他内容。由于某些奇怪的原因,replaceAll 函数不喜欢反斜杠。
String jarPath = "\\\\xyz\\abc\\wtf\\lame\\";
jarPath = jarPath.replaceAll("\\\\xyz\\abc", "z:");
我应该怎么做才能解决这个问题。
谢谢你。
我正在尝试用反斜杠将字符串的开头替换为其他内容。由于某些奇怪的原因,replaceAll 函数不喜欢反斜杠。
String jarPath = "\\\\xyz\\abc\\wtf\\lame\\";
jarPath = jarPath.replaceAll("\\\\xyz\\abc", "z:");
我应该怎么做才能解决这个问题。
谢谢你。
您需要将每个反斜杠(再次)加倍,因为 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
它不喜欢它,因为它\
是类 C 语言中的转义字符(即使在这个论坛上作为转义字符),这使得它成为文件分隔符的糟糕选择,但这是他们在 MS-DOS 中引入的一个变化......
你遇到的问题是你已经转义了\
两次,所以\\host\path
变成\\\\host\\path
了字符串,但是对于正则表达式必须再次转义:P\\\\\\\\host\\\\path
如果您可以使用正斜杠,这会简单得多
String jarPath = "//xyz/abc/wtf/lame/";
jarPath = jarPath.replaceAll("//xyz/abc", "z:");
replaceAll() 使用正则表达式,它使用反斜杠作为转义字符。此外,Java String 语法还使用反斜杠作为转义字符。这意味着您需要将所有反斜杠加倍才能获得所需的内容:
String jarPath = "\\\\xyz\\abc\\wtf\\lame\\";
jarPath = jarPath.replaceAll("\\\\\\\\xyz\\\\abc", "z:");
replaceAll
期望一个正则表达式作为其输入字符串,然后在每个实例中匹配和替换。反斜杠是正则表达式中的特殊转义字符,为了匹配它,您需要另一个反斜杠来转义它。因此,要将字符串与 匹配"\"
,您需要一个带有 '"\"` 的正则表达式。
要匹配字符串"\\\\xyz\\abc"
,您需要正则表达式(请注意每个 source"\\\\\\\\xyz\\\\abc"
的额外内容):\
\
String jarPath = "\\\\xyz\\abc\\wtf\\lame\\";
jarPath = jarPath.replaceAll("\\\\\\\\xyz\\\\abc", "z:");
jarPath = jarPath.replaceAll("\\\\\\\\xyz\\\\abc", "z:");
对于字符串中的每个 '\',您应该在replaceAll
方法中输入 '\\'。
replaceAll 方法使用正则表达式,这意味着您必须转义斜杠。在您的情况下,使用 String.replace 可能是有意义的:
String jarPath = "\\\\xyz\\abc\\wtf\\lame\\";
jarPath = jarPath.replace("\\\\xyz\\abc", "z:");
您可以在用例中使用 replace 方法而不是 replaceAll 。如果我没记错的话,它不使用正则表达式。
您也可以使用replace()
将从中删除\\\\xyz\\abc
的方法String
String jarPath = "\\\\xyz\\abc\\wtf\\lame\\";
jarPath = jarPath.replace("\\\\xyz\\abc", "z:");
刚遇到类似的问题。
如果您在 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
希望能帮助到你!