当我尝试用`\`替换`\\`时,为什么会出现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("\\\\", "\\\\");
令人惊讶的是,无论是搜索和替换字符串是相同的:)但仍做什么,我需要。
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
另外,应当文件分割符是不是? – Tom 2009-06-26 13:28:15
你有不同领域的连接结果是什么? – LB40 2009-06-26 13:29:48
@LB c:\\ myDoc \\ hell \ o.txt – 2009-06-26 13:52:52