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); } }
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的ES Proposal规范填充程序。 如果不可用或不String.prototype.replaceAll调用其“ shim”方法对String.prototype.replaceAll进行填充。 该软件包...
htmlStr =htmlStr.replaceAll("∀", "∀"); htmlStr =htmlStr.replaceAll("∂", "∂"); htmlStr =htmlStr.replaceAll("&exists;", "∃"); htmlStr =htmlStr.replaceAll("∅", "∅"); htmlStr...
主要给大家介绍了关于String.replaceAll方法,正则妙用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
js里没有replaceAll的函数,需要我们自定义 代码如下: String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,”gm”),s2); } 2、使用js的replace进行处理 代码如下: str=str....
要么无法忽略大小写 在海浪有帮助下,终于有了最佳实现方式:) 最佳实现方式: 代码如下:[removed] String.prototype.replaceAll = stringReplaceAll; function stringReplaceAll(AFindText,ARepT
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...
Jering.Javascript.NodeJS目录总览Jering.Javascript.NodeJS使您能够调用JavaScript中 ,从C#。 借助此功能,您可以使用C#项目中的javascript库和脚本... 静态API示例: string javascriptModule = @"module.exports
正则表达式主要配合以下方法使用 匹配 string.matches() 分割 string.split() 替换 string.replaceAll()
String.prototype.replaceAll = function(reallyDo, replaceWith, ignoreCase) { if (!RegExp.prototype.isPrototypeOf(reallyDo)) { return this.replace(new RegExp(reallyDo, (ignoreCase ? “gi”: “g...
$.replaceAll( selector ) Removing $.detach( [selector] ) $.empty( ) $.remove( [selector] ) Copying $.clone( [withDataAndEvents], [deepWithDataAndEvents] )1.5∗ Events Page Load $.ready( fn() ) Event ...
代码如下: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...
代码如下: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(成功测试详细 public static File ... downloadUrl = downloadUrl.replaceAll("ACCESS_TOKEN", accessToken).replaceAll("MEDIA_ID", mediaId); File file = null; File file2 = null;
代码如下: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: ...
获取公私钥 Map<String, String> map = SM2Util.getKeyPairStr();...String appId = str.trim().replaceAll("-","").toUpperCase(); String appSecret = str.trim().replaceAll("-","").toUpperCase();
String.prototype.replaceAll建议 地位 冠军:Mathias Bynens(Google,@ mathiasbynens)。 该提案处于第4阶段,计划包含在ES2021中。 动机 (另请参见。) 当前,如果不使用全局正则表达式,就无法替换字符串...
if (java.lang.Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")) { String[] temp = PinyinHelper.toHanyuPinyinStringArray(input[i], format); output += temp[0]; } else ...
主要介绍了Java String.replace()方法"无效"的原因及解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
"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 谜题 谜题 20:我的类是什么? 下面的程序被设计用来打印它的类文件的名称。如果你不熟悉类字面常量,那么 我告诉你 Me.class.getName()将返回 Me 类完整的名称,即 “com.javapuzzlers.Me”。那么,这个程序...