使用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)
答案 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 \\")
显然这里没有正则表达式,因此只有一次转义就足够了。