[改善Java代码]注意方法中传递的参数要求(replaceAll和replace的区别)
有这样一个简单的需求:写一个方法,实现从原始字符串中删除与之匹配的所有子字符串,比如"蓝蓝的天,白云飘"中,删除"白云飘",输出"蓝蓝的天," 代码如下:
public class StringUtils {
//删除字符串
public static String remove(String source,String sub){
return source.replaceAll(sub, "");
}
}
StringUtils工具类很简单,它采用了String的replace方法,改方法是做字符串替换的,我们来编写一个测试用例,检查remove方法是否正确.
import static org.junit.Assert.*;
import org.junit.Test;
public class StringUtilsTest {
@Test
public void testRemove() {
System.out.println(StringUtils.remove("好是好", "好"));
System.out.println(StringUtils.remove("$是$", "$"));
assertTrue(StringUtils.remove("好是好", "好").equals("是"));
assertTrue(StringUtils.remove("$是$", "$").equals("是"));
}
}
程序输出:
是
$是$
assertTrue(StringUtils.remove("好是好", "好").equals("是")); 测试的结果是绿条(Green Bar)
assertTrue(StringUtils.remove("$是$", "$").equals("是"));测试的结果是红条
问题出现在replaceAll方法上,改方法确实要传递两个String类型的参数,但是它要求第一个参数是一个正则表达式,符合正则表达式的字符串才会被替换.
对于上面的例子来说,第一个测试案例传递进来的是一个字符串"好",这是一个全匹配查找替换.处理的非常正确.
第二个测试案例传递进来的是"$"符号,"$"符号在正则表达式中表示的是字符串的结束位置,也就说执行完replaceAll后,在字符串结尾的地方加上了空字符串,其结果还是"$是$",所以测试失败....
使用replace方法替代即可,它是replaceAll方法的简化版,可传递两个String参数继续替换.
如果注意查看JDK文档,会发现replace(CharSequence target,CharSequence replacement)方法是在1.5版本之后才开始提供的,在此之前如果要对一个字符串进行全部替换,只能使用replaceAll方法,不过由于replaceAll方法的第一个参数使用了正则表达式,而且参数类型只要是CharSequence就可以(String的父类),所以很容易让使用者误解,稍有不慎就会导致严重的替换错误.

CharSequence的实现关系图:

注意:replaceAll传递的第一个参数是正则表达式
[改善Java代码]注意方法中传递的参数要求(replaceAll和replace的区别)的更多相关文章
- [改善Java代码]asList方法产生的List对象不可更改
上一个建议之处了asList方法在转换基本类型数组时候存在的问题,在看下asList方法返回的列表有何特殊的地方.看代码: import java.util.Arrays; import java.u ...
- [改善Java代码]减少HashMap中元素的数量
在系统开发中我们经常会使用HashMap作为数据集容器,或者是用缓冲池来处理,一般很稳定,但偶尔也会出现内存溢出的问题(OutOfMemory错误),而且这经常是与HashMap有关的.而且这经常是与 ...
- [改善Java代码]在equals中使用getClass进行类型判断
建议47: 在equals中使用getClass进行类型判断 本节我们继续讨论覆写equals的问题.这次我们编写一个员工Employee类继承Person类,这很正常,员工也是人嘛,而且在JEE中J ...
- [改善Java代码]在接口中不要存在实现代码
第3章 类.对象及方法 书读得多而不思考,你会觉得自己知道的很多. 书读得多而思考,你会觉得自己不懂的越来越多. —伏尔泰 在面向对象编程(Object-Oriented Programming,O ...
- java的split方法中的regex参数
我们需要以|进行分割,为了匹配|本身,正则中采用\|进行转义,而Java中\也表示转义,从java到正则需要必须使用\\|进行转义,即split中的\\表示正则的转义.
- 关于js 构造 onclick 方法中传递Guid参数问题
转义字符单双引号用法:\' 与 \" 例如: $.getJSON("data.json", function(data, status, xhr) { $(" ...
- Groovy小结:java调用Groovy方法并传递参数
Groovy小结:java调用Groovy方法并传递参数 @(JAVA总结) 1. 场景描述 在网上查了资料发现,java有三种方式调用groovy脚本.但是真正在实际的服务器环境中,嵌入groovy ...
- 改善EF代码的方法(下)
本节,我们将介绍一些改善EF代码的方法,包括编译查询.存储模型视图以及冲突处理等内容. > CompiledQuery 提供对查询的编译和缓存以供重新使用.当相同的查询需要执行很多遍的时候,那么 ...
- Java在方法中定义可变参数类型
学习目标: 掌握可变参数的应用 学习内容: 1.定义 在方法中传递数组有一种更简单的方式--方法的可变参数,其本质是一个语法糖,目的是让开发者写代码更简单. 2.语法 [修饰符] 返回值类型 方法名称 ...
随机推荐
- jvm所占空间的配置
http://www.cnblogs.com/mingforyou/archive/2012/03/03/2378143.html
- Win7下使Users数据与程序分离
大家知道,数据是用户最大的财富,但Windows系统默认的模式是将所有软件都安装在C盘,在Windows XP时代,数据文件夹会放在Document And Setting 目录下,在Win7时代,数 ...
- 前端的一些常用DOM和事件归纳
1.document.getElementById(id); document.getElementByTagName(tagName); document.getElementsByNa ...
- union all 简单用法
select Y.ID,sum(cast(Y.m as int)) as hefrom(select top 10 a.ID,a.AlarmSource as m from dbo.AlarmInfo ...
- Oracle数据库文件恢复与备份思路
怎样才能对Oracle数据库进行备份?如何才能对删除的数据再进行恢复?这是困扰着很多人的问题.大家都知道,任何数据库在长期使用过程中,都会存在一定的安全隐患.对于数据库管理员来说不能仅寄希望于计算机操 ...
- ASP.NET 尖括号 百分号 井号 等号 的用法
1.<%=%> 尖括号 百分号 等号 里面放的变量或方法,如: <div> <h1>Hello World</h1> <p><%= ...
- 更新插件时提示“正在更新缓存”“正在等待jockey-backend退出”
Ubuntu 11 更新语言插件, 更新时 提示正在更新缓存”“正在等待jockey-backend退出”,然后就不动了. 解决方案: 在终端中键入ps -e | grep jockey 系统会显示一 ...
- hdu 2037 今年暑假不AC (java)
问题: 此题为贪心算法入门,思路是先将各个时间段依照结束时间进行排序(按结束越早遍历.节目愈多), 再从第一个节目開始,假设下一节目開始时间大于上一节目的開始时间则进行该节目.依次递推. 输入时,要求 ...
- DynamoDB Local for Desktop Development
Would you like to be able to write and test code that uses the Amazon DynamoDB API even if you have ...
- mbstowcs_s实现wchar_t转成char
把char*转换为wchar_t* 用stdlib.h中的mbstowcs_s函数,可以通过下面的例子了解其用法: char*CStr = "string to convert"; ...