您的位置:首页 > 其它

String.replaceAll替换目标为反斜杠

2017-10-18 16:32 274 查看
今天想把string的某些内容替换为File.separator,windows环境出现个小问题,之前没注意过,记录下。

问题现象:

public static void main(String[] args) {
System.out.println("abcad".replaceAll("a", File.separator));
}
很简单的代码,但执行异常:

JDK1.6

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
at java.lang.String.charAt(String.java:686)
at java.util.regex.Matcher.appendReplacement(Matcher.java:703)
at java.util.regex.Matcher.replaceAll(Matcher.java:813)
at java.lang.String.replaceAll(String.java:2189)
at com.aires.login.LoginUtil.main(LoginUtil.java:12)


JDK1.8也抛异常,但异常信息有调整:

Exception in thread "main" java.lang.IllegalArgumentException: character to be escaped is missing
at java.util.regex.Matcher.appendReplacement(Matcher.java:809)
at java.util.regex.Matcher.replaceAll(Matcher.java:955)
at java.lang.String.replaceAll(String.java:2223)
at com.aires.login.LoginUtil.main(LoginUtil.java:12)


查看了下源码,String.replaceAll是通过Matcher.appendReplacement实现,在该实现中,如果遇到转义字符,则取下一个字符作为替换字符,而windows下的File.separator恰好为转义字符\,所以导致问题出现。

char nextChar = replacement.charAt(cursor);
if (nextChar == '\\') {
cursor++;//此处如果发现是转义字符\,将向后移动一位
nextChar = replacement.charAt(cursor);
result.append(nextChar);
cursor++;
}


正确需要如下形式:

public static void main(String[] args) {
System.out.println("abcad".replaceAll("a", "\\\\"));
}

另外$也是一个特殊字符(用于获取分组),使用时需要转义

"abcad".replaceAll("a", "\\$")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string replaceAll