String.replaceAll替换目标为反斜杠

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


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值