Java_语法基础_注意方法中传递的参数要求

有这样一个简单需求:写一个方法,实现从原始字符串中删除与之匹配的所有子字符串,比如在“蓝蓝的天,白云飘”中,删除“白云飘”,输出“蓝蓝的天,”,代码如下:

package deep;

public class StringUtils {
    // 删除字符串
    public static String remove(String source, String sub) {
        return source.replaceAll(sub, "");
    }
}

StringUtils工具类很简单,它采用了String的replace方法,该方法是做字符串替换的,我们来编写一个测试用例,检查remove方法是否正确,如下所示:

package deep;

import static org.junit.Assert.assertTrue;

import org.junit.Test;

public class StringTest {

    @Test
    public void test() {
        assertTrue(StringUtils.remove("好是好", "好").equals("是"));
    }

}

测试的结果是绿条(Green Bar),正确无误,但是再看看如下的测试用例:

package deep;

import static org.junit.Assert.assertTrue;

import org.junit.Test;

public class StringTest {

    @Test
    public void test() {
        assertTrue(StringUtils.remove("$是$", "$").equals("是"));
    }

}

上面只是把“好是好”中的两个“好”字替换成了一个“$”符号,猜猜结果会是什么,应该也是绿条吧?但是非常遗憾,结果是红条,测试未通过。就这么简单一个替换,为什么测试通不过呢?
问题就出在了replaceAll方法上,注意:它要求的第一个参数是一个正则表达式,符合正则表达式的字符串才会被替换。对上面的例子来说,第一个测试案例传递进来的是一个字符串“好”,这是一个全匹配查找替换,处理得非常正确,第二个测试案例传递进来的是“$”符号,“$”符号在正则表达式中表示的是字符串的结束位置,也就是说执行完replaceAll后,在字符串结尾的地方加上了空字符串,其结果还是“$$”,所以测试失败也就在所难免了。问题清楚了,解决方案也就出来了:使用replace方法替代即可,它是reolaceAll方法的简化版,可传递两个String参数继续替换,与我们的编码意图是相吻合的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章