今天在会友哥的电政导论课上写法师的作业,很简单,就是实现一个函数:屏蔽字符串参数text 中的网页链接信息,并且替换成"OMIT"+计数器.
正则表达式没有什么问题,但是在计数器上面就悲剧了,最初是用String 中的 replaceAll函数进行匹配和替换,三行代码搞掂:
String s = text.replaceAll(regex,"OMIT"+(count++));
return s;
但是结果很悲催,OMIT后面的count并没有改变,于是去读了replaceAll的源码:
public String replaceAll(String regex, String replacement)
{
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}
public String replaceAll(String replacement)
{
reset(); boolean result = find();
if (result)
{
StringBuffer sb = new StringBuffer();
do {
appendReplacement(sb, replacement);
result = find();
}
while (result);
appendTail(sb);
return sb.toString();
}
return text.toString();
}
可以看到,replaceAll是一次性接收整个需要替换的字符串,在我的代码上,此时传入第二个replaceAll的参数replacement只是第一次的count,即1.所以得出的结果,计数器并没有变化.
后来对代码进行改进,直接运用appendReplacement:
String replacement = "OMIT";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(text);
StringBuffer sb = new StringBuffer();
while(m.find())
{
m.appendReplacement(sb, replacement+count);
count++;
}
m.appendTail(sb);
这样直接将给定的字符串进行匹配,匹配的结果以group的形式进行替换,这样count就会累加并显示在替换后的字符串上了.最后不要忘记用appendTail.