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进行填充。 该软件包...
在Java编程语言中,`String.replaceAll`方法是一个非常强大的工具,尤其当结合正则表达式使用时,可以实现复杂的文本处理。本文将深入探讨`String.replaceAll`方法的使用及其背后的正则表达式分组概念。 首先,`...
文章接着介绍了如何自定义一个replaceAll函数,这个函数利用了String对象的原型,通过扩展String原型来添加replaceAll方法,使其成为String对象可以调用的新方法。这个自定义的replaceAll方法不仅考虑了正则表达式和...
htmlStr =htmlStr.replaceAll("∀", "∀"); htmlStr =htmlStr.replaceAll("∂", "∂"); htmlStr =htmlStr.replaceAll("&exists;", "∃"); htmlStr =htmlStr.replaceAll("∅", "∅"); htmlStr...
### Java中的`String.replaceAll()`方法详解 #### 一、引言 `String.replaceAll()`方法是Java编程语言中用于字符串操作的一个非常强大的工具。通过利用正则表达式(Regular Expression),此方法可以实现对字符串中...
js里没有replaceAll的函数,需要我们自定义 代码如下: String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,”gm”),s2); } 2、使用js的replace进行处理 代码如下: str=str....
在ESNext中,引入了新的String.prototype.replaceAll()方法,该方法可以实现全量字符串替换。例如: `const s = 'hello. hello. hello.';` `s.replaceAll('hello. ', 'A');` 该方法的优点是可以实现全量替换,不...
Java 中的 String 类提供了三种方法来实现字符串的替换,分别是 replace、replaceAll 和 replaceFirst。 1. replace 方法 replace 方法将字符串中所有出现的 oldChar 字符串替换为 newChar 字符串。如: String ...
在本压缩包“字符串string.zip”中,主要包含的是与Java编程语言中字符串相关的教学资料,特别是针对S1课程的学员。这个课程旨在帮助学生深入理解程序逻辑,并且重点聚焦在Java中的字符串处理。文件“Chapter15”...
Java中的`replace`、`replaceAll`和`replaceFirst`是字符串操作中常见的方法,用于替换字符串中的特定子串。它们都是`String`类的方法,但各自有不同的行为和用途。 1. `replace(CharSequence target, CharSequence...
在使用Java String类型的replace和replaceAll方法时,我们需要注意这种机制,不要以为replace和replaceAll方法会修改原来的字符串对象,而是需要将返回值赋值给一个新的字符串对象。 补充知识:Java String字符串...
要么无法忽略大小写 在海浪有帮助下,终于有了最佳实现方式:) 最佳实现方式: 代码如下:[removed] String.prototype.replaceAll = stringReplaceAll; function stringReplaceAll(AFindText,ARepT
### Java程序设计基础:String类的常用方法详解 #### 一、引言 在Java编程中,`String` 类是最常用的内置数据类型之一,用于表示不可变的字符序列。掌握`String` 类的各种方法能够帮助开发者更加高效地处理文本...
Java中的`String`类是编程中非常基础且重要的部分,它代表不可变的字符序列。在Java中,字符串常量都是存储在常量池中,每次创建新的`String`对象时,如果常量池中已经存在相同的字符串,那么就不会创建新的实例,...
5. **$.load()**: 加载服务器数据并插入到DOM中。 **六、jQuery插件** jQuery的生态系统包含了大量高质量的插件,如: 1. **轮播插件**: 如Slick,Swiper等用于创建滑动效果的图片或内容展示。 2. **表单验证**: 如...
JavaScript中的String对象是编程中非常基础且重要的概念,它用于表示和操作文本数据。在JavaScript中,通过单引号或双引号包围的任何字符序列都会被视为字符串,并且它们本质上都是String构造函数的实例。本节主要...
Java探索之string字符...本文主要介绍了Java探索之string字符串的应用代码示例,包括indexOf方法、实现startsWith和endsWith功能、采用字符的移位方式实现字符文本加密解密等知识点,对Java开发者具有一定的参考价值。
Java去除字符串中空格的方法详解 Java中去除字符串中空格的方法有多种,以下是常见的五种方法: 1. 使用trim()方法:str.trim() 可以去掉字符串的首尾空格,但不能去掉中间的空格。 2. 使用replace()方法:str....