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

Java的String.replaceAll(…)不适用于\\和\,java,replaceall,Java,Replaceall,我想从以下位置转换目录路径: C:\Users\Host\Desktop\picture.jpg 到 我正在使用replaceAll()函数和其他replace函数,但它们不起作用 我该怎么做 我已经打印了这份声明,它给了我想要的 C:\Users\Host\Desktop\picture.jpg 但是现在当我传递这个变量来打开文件时,我得到了这个异常为什么 java.io.FileNotFoundException:C:\Users\Host\Desktop\picture.jpg编辑:从r

我想从以下位置转换目录路径:

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

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

我该怎么做

我已经打印了这份声明,它给了我想要的 C:\Users\Host\Desktop\picture.jpg 但是现在当我传递这个变量来打开文件时,我得到了这个异常为什么


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

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

我猜(因为您没有提供足够的信息)您正在做的事情如下:

text.replace("\\", "\\\\");
字符串在Java中是不可变的,因此需要使用返回值,例如

String newText = oldText.replace("\\", "\\\\");
如果这不能回答您的问题,请提供更多信息

(我还建议,通常你不应该自己做这件事——如果这是为了在JSON响应中包含信息,我希望更广泛的库为你执行转义。)

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


编辑:你现在得到了一个
FileNotFoundException
,因为里面没有带双反斜杠的文件名-你怎么会认为有?如果要将其作为有效文件名,为什么要将反斜杠加倍?

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

我猜(因为您没有提供足够的信息)您正在做的事情如下:

text.replace("\\", "\\\\");
字符串在Java中是不可变的,因此需要使用返回值,例如

String newText = oldText.replace("\\", "\\\\");
如果这不能回答您的问题,请提供更多信息

(我还建议,通常你不应该自己做这件事——如果这是为了在JSON响应中包含信息,我希望更广泛的库为你执行转义。)

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


编辑:你现在得到了一个
FileNotFoundException
,因为里面没有带双反斜杠的文件名-你怎么会认为有?如果要将其作为有效文件名,为什么要将反斜杠加倍?

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

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

String t2 = t1.replaceAll("\\\\", "\\\\\\\\");
或(无图案):

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

你必须使用:

String t2 = t1.replaceAll("\\\\", "\\\\\\\\");
或(无图案):

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

两种解释:

1.将双反斜杠替换为一(不是您要求的) 你必须一个接一个地避开反斜杠。像这样:

String newPath = oldPath.replaceAll("\\\\\\\\", "\\");
第一个参数需要转义两次。一次用于Java编译器,一次用于正则表达式。因此,您希望用一个反斜杠替换两个反斜杠。所以,既然我们必须避开一个反斜杠,就加上一个反斜杠。现在您有了
\
。这将被编译为
\
但是必须再次转义反斜杠,因为replaceAll方法的第一个参数使用正则表达式。所以要转义它,添加一个反斜杠,但是这个反斜杠需要转义,所以我们得到
\\\
。这些反斜杠表示正则表达式中的一个反斜杠。但您希望将双反斜杠替换为一。所以用8个反斜杠

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

2.将单个反斜杠替换为一对反斜杠(根据您的要求) 逻辑同上

3.使用
replace()
代替
replaceAll()
。 不同之处在于
replace()
方法不使用正则表达式,因此不必对第一个参数的每个反斜杠转义两次

希望我解释得很好

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

两种解释:

1.将双反斜杠替换为一(不是您要求的) 你必须一个接一个地避开反斜杠。像这样:

String newPath = oldPath.replaceAll("\\\\\\\\", "\\");
第一个参数需要转义两次。一次用于Java编译器,一次用于正则表达式。因此,您希望用一个反斜杠替换两个反斜杠。所以,既然我们必须避开一个反斜杠,就加上一个反斜杠。现在您有了
\
。这将被编译为
\
但是由于rep的第一个参数