String.replaceAll替换目标为反斜杠

来源:互联网 发布:七星彩规律软件 编辑:程序博客网 时间:2024/05/18 12:32

今天想把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: 1at 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 missingat 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", "\\$")


阅读全文
0 0