`
DavyJones2010
  • 浏览: 154305 次
  • 性别: 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进行填充。 该软件包...

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

    在Java编程语言中,`String.replaceAll`方法是一个非常强大的工具,尤其当结合正则表达式使用时,可以实现复杂的文本处理。本文将深入探讨`String.replaceAll`方法的使用及其背后的正则表达式分组概念。 首先,`...

    JS中实现replaceAll的方法(实例代码)

    文章接着介绍了如何自定义一个replaceAll函数,这个函数利用了String对象的原型,通过扩展String原型来添加replaceAll方法,使其成为String对象可以调用的新方法。这个自定义的replaceAll方法不仅考虑了正则表达式和...

    java替换html特殊字符工具类

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

    javastringreplaceALL()用法.pdf

    ### Java中的`String.replaceAll()`方法详解 #### 一、引言 `String.replaceAll()`方法是Java编程语言中用于字符串操作的一个非常强大的工具。通过利用正则表达式(Regular Expression),此方法可以实现对字符串中...

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

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

    js实战之全部替代一个子串为另一个子串.pdf

    在ESNext中,引入了新的String.prototype.replaceAll()方法,该方法可以实现全量字符串替换。例如: `const s = 'hello. hello. hello.';` `s.replaceAll('hello. ', 'A');` 该方法的优点是可以实现全量替换,不...

    Java的 String 类常用方法大全

    Java 中的 String 类提供了三种方法来实现字符串的替换,分别是 replace、replaceAll 和 replaceFirst。 1. replace 方法 replace 方法将字符串中所有出现的 oldChar 字符串替换为 newChar 字符串。如: String ...

    字符串string.zip

    在本压缩包“字符串string.zip”中,主要包含的是与Java编程语言中字符串相关的教学资料,特别是针对S1课程的学员。这个课程旨在帮助学生深入理解程序逻辑,并且重点聚焦在Java中的字符串处理。文件“Chapter15”...

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

    在使用Java String类型的replace和replaceAll方法时,我们需要注意这种机制,不要以为replace和replaceAll方法会修改原来的字符串对象,而是需要将返回值赋值给一个新的字符串对象。 补充知识:Java String字符串...

    Java中replace、replaceAll和replaceFirst函数的用法小结

    Java中的`replace`、`replaceAll`和`replaceFirst`是字符串操作中常见的方法,用于替换字符串中的特定子串。它们都是`String`类的方法,但各自有不同的行为和用途。 1. `replace(CharSequence target, CharSequence...

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

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

    Java程序设计基础:String类的常用方法(二.pptx

    ### Java程序设计基础:String类的常用方法详解 #### 一、引言 在Java编程中,`String` 类是最常用的内置数据类型之一,用于表示不可变的字符序列。掌握`String` 类的各种方法能够帮助开发者更加高效地处理文本...

    JavaString常见操作.pdf

    Java中的`String`类是编程中非常基础且重要的部分,它代表不可变的字符序列。在Java中,字符串常量都是存储在常量池中,每次创建新的`String`对象时,如果常量池中已经存在相同的字符串,那么就不会创建新的实例,...

    jquery中文手册

    5. **$.load()**: 加载服务器数据并插入到DOM中。 **六、jQuery插件** jQuery的生态系统包含了大量高质量的插件,如: 1. **轮播插件**: 如Slick,Swiper等用于创建滑动效果的图片或内容展示。 2. **表单验证**: 如...

    JavaScript程序设计课件:String对象.pptx

    JavaScript中的String对象是编程中非常基础且重要的概念,它用于表示和操作文本数据。在JavaScript中,通过单引号或双引号包围的任何字符序列都会被视为字符串,并且它们本质上都是String构造函数的实例。本节主要...

    Java探索之string字符串的应用代码示例

    Java探索之string字符...本文主要介绍了Java探索之string字符串的应用代码示例,包括indexOf方法、实现startsWith和endsWith功能、采用字符的移位方式实现字符文本加密解密等知识点,对Java开发者具有一定的参考价值。

    Java去除字符串中空格的方法详解

    Java去除字符串中空格的方法详解 Java中去除字符串中空格的方法有多种,以下是常见的五种方法: 1. 使用trim()方法:str.trim() 可以去掉字符串的首尾空格,但不能去掉中间的空格。 2. 使用replace()方法:str....

Global site tag (gtag.js) - Google Analytics