当我尝试用`\`替换`\\`时,为什么会出现StringIndexOutOfBoundsException?

问题描述:

我必须用Java替换\\\。我正在使用的代码是当我尝试用``替换`\`时,为什么会出现StringIndexOutOfBoundsException?

System.out.println((MyConstants.LOCATION_PATH + File.separator + myObject.getStLocation()).replaceAll("\\\\", "\\")); 

但我不知道它为什么投掷StringIndexOutOfBoundsException

它说String index out of range: 1

可能是什么原因?我想这是因为第一个参数replaceAll接受一个模式。可能的解决方案是什么?


堆栈跟踪

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1 
    at java.lang.String.charAt(String.java:558) 
    at java.util.regex.Matcher.appendReplacement(Matcher.java:696) 
    at java.util.regex.Matcher.replaceAll(Matcher.java:806) 
    at java.lang.String.replaceAll(String.java:2000) 

答案找到

asalamon74发布我所需要的代码,但我不知道他为什么删除了它。在任何情况下,它都是。

已经有一个bug已经提交给Java的错误数据库。 (感谢这个参考,asalamon。)

yourString.replaceAll("\\\\", "\\\\"); 

令人惊讶的是,无论是搜索和替换字符串是相同的:)但仍做什么,我需要。

+0

另外,应当文件分割符是不是? – Tom 2009-06-26 13:28:15

+0

你有不同领域的连接结果是什么? – LB40 2009-06-26 13:29:48

+0

@LB c:\\ myDoc \\ hell \ o.txt – 2009-06-26 13:52:52

File.seperator已经被转义,就像任何字符串对象一样,所以你将它们转义了两次。

您只需要转义您输入为字符串文字的值。

使用String.replace代替replaceAll,以避免它使用正则表达式:

String original = MyConstants.LOCATION_PATH + File.seperator 
    + myObject.getStLocation(); 
System.out.println(original.replace("\\\\", "\\")); 

个人而言,我不会做它,虽然这样 - 我想创建MyConstants.LOCATION_PATH_FILE为File,然后你可以写:

File location = new File(MyConstants.LOCATION_PATH_FILE, 
         myObject.getStLocation()); 

这将自动做正确的事情。

我怀疑问题是replaceAll()使用正则表达式,反斜杠是正则表达式和Java中的转义字符 - 可能需要加倍反斜杠的数量。

一般而言,您应该总是发布完整的异常堆栈跟踪,这样诊断问题要容易得多。

我相信你需要做的是:

System.out.println((MyConstants.LOCATION_PATH + File.separator + myObject.getStLocation()).replaceAll("\\\\\\\\", "\\\\")); 

正则表达式字符串实际上是四个反斜杠,这是一个正则表达式匹配两个反斜杠。

替换字符串是四个斜线按照Java文档,从: http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#replaceAll(java.lang.String)

注意,在替换字符串中的反斜杠()和美元符号($)可能会导致实际结果与不同如果它被视为字面替换字符串。如上所述,美元符号可以视为对捕获的子序列的引用,而反斜杠用于转义替换字符串中的文字字符。

嗯,我想

String test = "just a \\ test with some \\\\ and others \\\\ or \\ so"; 
    String result = test.replaceAll("\\\\", "\\\\"); 
    System.out.println(test); 
    System.out.println(result); 
    System.out.println(test.equals(result)); 

并获得了预期

just a \ test with some \\ and others \\ or \ so 
just a \ test with some \\ and others \\ or \ so 
true 

你真的需要什么

string.replaceAll("\\\\\\\\", "\\\\"); 

得到

just a \ test with some \\ and others \\ or \ so 
just a \ test with some \ and others \ or \ so 
false 

你想找到:\\(2斜杠)
这需要在正则表达式进行转义:\\\\(4斜杠)
和Java的转义:"\\\\\\\\"(8个斜杠)
同为更换...

final StringBuilder result = new StringBuilder(); 
final StringCharacterIterator iterator = new StringCharacterIterator(str); 
char character = iterator.current(); 
while (character != CharacterIterator.DONE) 
{ 
    if (character == '\\\\') { 
    result.append("\\"); 
    } 
    else { 
    result.append(character); 
    } 

    character = iterator.next(); 
} 

System.out.print(result); 

试试这个

cadena.replaceAll("\\\\","\\\\\\\\") 

对于正则表达式,如果你想改变\\\,你应该这样做:

if (str.indexOf('\\') > -1) 
    str = str.replaceAll("\\\\", "\\\\\\\\"); 
str = "\"" + str + "\""; 

\\\\意味着\\\\\\\\\意味着\\

最好的办法是:

str.replace(**'**\\**'**, **'**/**'**); //with char method not String