Java SE: String.replaceAll() with special character "$"

1. Problem Description:

    When replacement contains "$", either IllegalArgumentException or StringIndexOutOfBoundsException will be thrown.

    The reason is that replaceAll() is not simply character replacement, it uses regex as "placeholder expression".

    And the character "$" is treated as the end of line boundry matcher in regex.

 

    Java API for replaceAll() method:

public String replaceAll(String regex, String replacement);

    JavaDoc For replaceAll() method:

Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; see Matcher.replaceAll. Use java.util.regex.Matcher.quoteReplacement to suppress the special meaning of these characters, if desired.

 

    Case 1:

package edu.xmu.string;

public class ReplaceAllTest {
    public static void main(String[] args) {
	String str = "abcdefg";
	String placeholder = "abc";
	String replacement = "a$bc";
	String replacedStr = str.replaceAll(placeholder, replacement);
	System.out.println(replacedStr);
    }
}
Exception in thread "main" java.lang.IllegalArgumentException: Illegal group reference
	at java.util.regex.Matcher.appendReplacement(Matcher.java:808)
	at java.util.regex.Matcher.replaceAll(Matcher.java:906)
	at java.lang.String.replaceAll(String.java:2162)
	at edu.xmu.string.ReplaceAllTest.main(ReplaceAllTest.java:8)
    Case 2:
package edu.xmu.string;

public class ReplaceAllTest {
    public static void main(String[] args) {
	String str = "abcdefg";
	String placeholder = "abc";
	String replacement = "abc$";
	String replacedStr = str.replaceAll(placeholder, replacement);
	System.out.println(replacedStr);
    }
}
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4
	at java.lang.String.charAt(String.java:658)
	at java.util.regex.Matcher.appendReplacement(Matcher.java:772)
	at java.util.regex.Matcher.replaceAll(Matcher.java:906)
	at java.lang.String.replaceAll(String.java:2162)
	at edu.xmu.string.ReplaceAllTest.main(ReplaceAllTest.java:8)
 
2) Available Solutions:
    1) If we may predefine (hardcode) the replacement:
package edu.xmu.string;

public class ReplaceAllTest {
    public static void main(String[] args) {
	String str = "abcdefg";
	String placeholder = "abc";
	String replacement = "\\$abc"; // Use backslash to make sure "$" is treated as normal character
	String replacedStr = str.replaceAll(placeholder, replacement);
	System.out.println(replacedStr);
    }
}
    2) If we cannot predefine (hardcode) the replacement(the replacement is passed in as parameter):
    Manually preprocess for special character in replacement. 
package edu.xmu.string;

public class ReplaceAllTest {
    public static void main(String[] args) {
	String str = "abcdefg";
	String placeholder = "abc";
	String replacement = "$abc";
	replacement = replacement.replaceAll("\\$", "\\\\\\$"); // preprocessment for the special character in replacement.
	String replacedStr = str.replaceAll(placeholder, replacement);
	System.out.println(replacedStr);
    }
}
    Or automatically preprocess for special character in replacement.
package edu.xmu.string;

import java.util.regex.Matcher;

public class ReplaceAllTest {
    public static void main(String[] args) {
	String str = "abcdefg";
	String placeholder = "abc";
	String replacement = "$abc";
	replacement = Matcher.quoteReplacement(replacement);  // preprocessment for the special character in replacement.
	String replacedStr = str.replaceAll(placeholder, replacement);
	System.out.println(replacedStr);
    }
}
   Or use Apache's StringUtils.replace(...), it is preferred if all we need is simple character replacement without using regex. 
package edu.xmu.string;

import org.apache.commons.lang.StringUtils;

public class ReplaceAllTest {
    public static void main(String[] args) {
	String str = "abcdefg";
	String placeholder = "abc";
	String replacement = "$abc";
	String replacedStr = StringUtils.replace(str, placeholder, replacement); // apache's StringUtils do not use regex for replacement.
	System.out.println(replacedStr);
    }
}

 

Reference Links:

1) http://www.coderanch.com/t/383666/java/java/String-replaceAll

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值