String.replaceAll(...)的Java不适用于\\和\

时间:2012-02-03 15:49:10

标签: java replaceall

我想转换目录路径:

C:\Users\Host\Desktop\picture.jpg

C:\\Users\\Host\\Desktop\\picture.jpg

我正在使用replaceAll()函数和其他替换函数,但它们不起作用。

我该怎么做?

我已经打印了声明,它给了我想要的那个,即 C:\ Users \用户主机\桌面\ picture.jpg 但是现在当我传递这个变量来打开文件时,我得到了这个例外的原因吗?

java.io.FileNotFoundException:C:\ Users \ Host \ Desktop \ picture.jpg

4 个答案:

答案 0 :(得分:6)

编辑:从replaceAll更改为replace - 此处不需要正则表达式,因此请勿使用正则表达式。 (对于Java API团队,IMO来说,这是一个非常糟糕的设计决策。)

我的猜测(因为你没有提供足够的信息)是你正在做的事情:

text.replace("\\", "\\\\");

字符串在Java中是不可变的,因此您需要使用返回值,例如

String newText = oldText.replace("\\", "\\\\");

如果这不能回答您的问题,请提供更多信息。

(我还建议通常你不应该自己这样做 - 如果要将信息包含在JSON响应中,我希望更广泛的库为你逃跑。)

请注意,需要加倍,因为\是Java字符串(和字符)文字的转义字符。请注意,由于replace不会将输入视为正则表达式模式,因此不需要执行进一步的加倍,与replaceAll不同。

编辑:你现在得到FileNotFoundException,因为不是带有双反斜杠的文件名 - 是什么让你认为有?如果你想把它作为一个有效的文件名,你为什么要加倍反斜杠?

答案 1 :(得分:5)

你必须使用:

String t2 = t1.replaceAll("\\\\", "\\\\\\\\");

或(没有模式):

String t2 = t1.replace("\\", "\\\\");

每个“\”必须在另一个“\”之前。但是对于前面的“\”也是如此,所以每次你想要一个正则表达式时你必须写四个反斜杠。

答案 2 :(得分:0)

在strings \中被默认用作转义字符因此,为了在字符串中选择“\”,你必须使用“\”而对于“\”(即blackslack两次)使用“\\”。这将解决您的问题,也将适用于其他符号,如“

答案 3 :(得分:0)

两种解释:

1。将双反斜杠替换为一个(不是你要求的)

你必须通过反斜杠来逃避反斜杠。像这样:

String newPath = oldPath.replaceAll("\\\\\\\\", "\\");

第一个参数需要转义两次。一次用于Java编译器,一次用于使用正则表达式。所以你想要用一个替换两个反斜杠。所以,因为我们必须逃避反斜杠添加一个反斜杠。现在你有\\。这将编译为\但是!! 你必须再次转义反斜杠,因为replaceAll方法的第一个参数使用正则表达式。所以为了逃避它,添加一个反斜杠,但反斜杠需要转义,所以我们得到\\\\。反斜杠的这些代表正则表达式中的一个反斜杠。但是你想要将双反斜杠替换成一个。所以使用8个反斜杠。

replaceAll方法的第二个参数不使用正则表达式,但它也必须进行转义。因此,您需要为Java编译器转义一次,对于替换方法需要转义一次:\\\\。这被编译为两个反斜杠,在replaceAll方法中被解释为1个反斜杠。

2。将单反斜杠替换为一对反斜杠(你问的是什么)

String newPath = oldPath.replaceAll("\\\\", "\\\\\\\\");

与上述逻辑相同。

3。使用replace()代替replaceAll()

String newPath = oldPath.replace("\\", "\\\\");

不同之处在于replace()方法不使用正则表达式,因此您不必为第一个参数转义两次反斜杠。

希望,我解释得很好......

- 编辑:修正了错误,正如xehpuk所指出的那样 -