我想转换目录路径:
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
答案 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)
两种解释:
你必须通过反斜杠来逃避反斜杠。像这样:
String newPath = oldPath.replaceAll("\\\\\\\\", "\\");
第一个参数需要转义两次。一次用于Java编译器,一次用于使用正则表达式。所以你想要用一个替换两个反斜杠。所以,因为我们必须逃避反斜杠添加一个反斜杠。现在你有\\
。这将编译为\
。 但是!! 你必须再次转义反斜杠,因为replaceAll方法的第一个参数使用正则表达式。所以为了逃避它,添加一个反斜杠,但反斜杠需要转义,所以我们得到\\\\
。反斜杠的这些代表正则表达式中的一个反斜杠。但是你想要将双反斜杠替换成一个。所以使用8个反斜杠。
replaceAll方法的第二个参数不使用正则表达式,但它也必须进行转义。因此,您需要为Java编译器转义一次,对于替换方法需要转义一次:\\\\
。这被编译为两个反斜杠,在replaceAll方法中被解释为1个反斜杠。
String newPath = oldPath.replaceAll("\\\\", "\\\\\\\\");
与上述逻辑相同。
replace()
代替replaceAll()
。String newPath = oldPath.replace("\\", "\\\\");
不同之处在于replace()
方法不使用正则表达式,因此您不必为第一个参数转义两次反斜杠。
希望,我解释得很好......
- 编辑:修正了错误,正如xehpuk所指出的那样 -