`
DavyJones2010
  • 浏览: 147531 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    String.prototype.replaceAll:适用于String.prototype.replaceAll ESnext提案的符合规范的polyfill

    string.prototype.replaceall 用于String.prototype.replaceAll的ES Proposal规范填充程序。 如果不可用或不String.prototype.replaceAll调用其“ shim”方法对String.prototype.replaceAll进行填充。 该软件包...

    java替换html特殊字符工具类

    htmlStr =htmlStr.replaceAll("∀", "∀"); htmlStr =htmlStr.replaceAll("∂", "∂"); htmlStr =htmlStr.replaceAll("&exists;", "∃"); htmlStr =htmlStr.replaceAll("∅", "∅"); htmlStr...

    String.replaceAll方法详析(正则妙用)

    主要给大家介绍了关于String.replaceAll方法,正则妙用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    Js 回车换行处理的办法及replace方法应用

    js里没有replaceAll的函数,需要我们自定义 代码如下: String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,”gm”),s2); } 2、使用js的replace进行处理 代码如下: str=str....

    用JavaScript实现全局替换,解决$等特殊符号的难题[

    要么无法忽略大小写 在海浪有帮助下,终于有了最佳实现方式:) 最佳实现方式: 代码如下:[removed] String.prototype.replaceAll = stringReplaceAll; function stringReplaceAll(AFindText,ARepT

    java金额转大写

    public static String arabNumToChineseRMB(int moneyNum){ String res=""; int i=3; if(moneyNum==0) return "零元"; while(moneyNum>0){ res=ChineseUnit[i++]+res; res=ChineseNum[moneyNum]+res; money...

    Javascript.NodeJS:从C#调用NodeJS中的Javascript

    Jering.Javascript.NodeJS目录总览Jering.Javascript.NodeJS使您能够调用JavaScript中 ,从C#。 借助此功能,您可以使用C#项目中的javascript库和脚本... 静态API示例: string javascriptModule = @"module.exports

    java-正则表达式-正则表达式元素介绍

    正则表达式主要配合以下方法使用 匹配 string.matches() 分割 string.split() 替换 string.replaceAll()

    JavaScript实现的字符串replaceAll函数代码分享

    String.prototype.replaceAll = function(reallyDo, replaceWith, ignoreCase) {   if (!RegExp.prototype.isPrototypeOf(reallyDo)) {   return this.replace(new RegExp(reallyDo, (ignoreCase ? “gi”: “g...

    jQuery 1.5 API 中文版

    $.replaceAll( selector ) Removing $.detach( [selector] ) $.empty( ) $.remove( [selector] ) Copying $.clone( [withDataAndEvents], [deepWithDataAndEvents] )1.5∗ Events Page Load $.ready( fn() ) Event ...

    jQuery弹出层插件简化版代码第1/2页

    代码如下:String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,”gm”),s2); }; (function($){ /* * $-layer 0.1 – New Wave Javascript * * Copyright (c) 2008 King Wong * $Date...

    jQuery弹出层插件简化版代码下载

    代码如下:String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,”gm”),s2); }; (function($){ /* * $-layer 0.1 – New Wave Javascript * * Copyright (c) 2008 King Wong ...

    微信下载录音amr转换MP3.docx

    微信下载录音amr转换MP3(成功测试详细 public static File ... downloadUrl = downloadUrl.replaceAll("ACCESS_TOKEN", accessToken).replaceAll("MEDIA_ID", mediaId); File file = null; File file2 = null;

    一个jquery的弹出层的插件第1/2页

    代码如下:String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,”gm”),s2); }; (function($){ /* * $-layer 0.1 – jquery pulg-in * * Copyright (c) 2008 King Wong * $Date: ...

    sm2sm4加解密加签验签demo

    获取公私钥 Map<String, String> map = SM2Util.getKeyPairStr();...String appId = str.trim().replaceAll("-","").toUpperCase(); String appSecret = str.trim().replaceAll("-","").toUpperCase();

    proposal-string-replaceall:ECMAScript建议

    String.prototype.replaceAll建议 地位 冠军:Mathias Bynens(Google,@ mathiasbynens)。 该提案处于第4阶段,计划包含在ES2021中。 动机 (另请参见。) 当前,如果不使用全局正则表达式,就无法替换字符串...

    java写的将字符串中的中文转化为拼音等一系列方法

    if (java.lang.Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")) { String[] temp = PinyinHelper.toHanyuPinyinStringArray(input[i], format); output += temp[0]; } else ...

    Java String.replace()方法"无效"的原因及解决方式

    主要介绍了Java String.replace()方法"无效"的原因及解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    JSUtils:您可能会发现有用的随机javascript实用程序

    "string".replaceAll(search: string, replace: string) "aaa" . replaceAll ( "a" , "b" ) ; // => bbb 对"aaa".replace("a", "b"); // => "baa"的修复"aaa".replace("a", "b"); // => "baa" "aaa".replace("a", ...

    JAVA解惑.pdf

    Java 谜题 谜题 20:我的类是什么? 下面的程序被设计用来打印它的类文件的名称。如果你不熟悉类字面常量,那么 我告诉你 Me.class.getName()将返回 Me 类完整的名称,即 “com.javapuzzlers.Me”。那么,这个程序...

Global site tag (gtag.js) - Google Analytics