replaceFirst ArrayOutOfBoundsException

时间:2013-10-01 10:52:28

标签: java regex replace

使用ArrayOutOfBoundsException时,我发现了一个奇怪的replaceFirst

"this is an example string".replaceFirst("(^this )", "$1\\") // throws ArrayOutOfBoundsException
"this is an example string".replaceFirst("(^this )", "$1") // works fine

我正在尝试实现此字符串:

"this \is an example string"

如果我尝试在替换字符串中放入转义反斜杠,为什么会出现ArrayOutOfBoundsException?这种情况在Android上发生,如果它有所作为

这是例外的ideone示例。

这是logcat异常堆栈跟踪:

  

java.lang.ArrayIndexOutOfBoundsException:index = 14           在java.util.regex.Matcher.appendEvaluated(Matcher.java:149)           在java.util.regex.Matcher.appendReplacement(Matcher.java:111)           在java.util.regex.Matcher.replaceFirst(Matcher.java:304)           在java.lang.String.replaceFirst(String.java:1793)

4 个答案:

答案 0 :(得分:3)

你需要使用这个正则表达式: -

"this is an example string".replaceFirst("(^this )", "$1\\\\");

因为\需要进行双重转义。因此,对于每个\,您需要4 \(最初您需要2 \,因此请提供此信息,以防您以后需要更改。)

this answer引用几行: -

  

第二个参数不是正则表达式字符串,而是a   regex-replacement-string,其中反斜杠也有一个特殊的   含义(它用于转义用于的特殊字符$   变量插值,也用于逃避自身)

答案 1 :(得分:2)

"this is an example string".replaceFirst("(^this )", "$1\\")

在上面的代码中,\\实际上只是一个\(第一个反斜杠用于转义第二个,因为字符串中的反斜杠用于转义其他内容,并不代表任何东西本身)。

但是!在正则表达式中,单个反斜杠本身用于转义目的,因此需要再次转义。因此,如果在Java中的正则表达式String中需要文字反斜杠,则需要编写四个反斜杠"\\\\"

答案 2 :(得分:1)

尝试:

"this is an example string".replaceFirst("(^this )", "$1\\\\");

输出:

this \is an example string

String上的replaceFirst类似replaceAll函数执行正则表达式,你必须首先转义\,因为它是一个文字(屈服\\),然后逃脱它再次因为正则表达式(屈服\\\\)。

答案 3 :(得分:1)

您将需要:

"this is an example string".replaceFirst("(^this )", "$1\\\\");

因为正则表达式需要双重转义。

PS:即使替换后的字符串实际上不是正则表达式,但由于使用了$1$2等分组变量,它仍然由正则表达式引擎和因此需要双重逃避。

**相反,如果你想避免使用正则表达式,那么只需使用Sring#replace(String n, String r)

"this is an example string".replace("this ", "this \\")

显然这里没有正则表达式,因此只有一次转义就足够了。