Java 不区分大小写的高亮替换
近期在做一个搜索引擎,需要匹配字符高亮显示。
现在有字符串 "struts StrUts hibernate",我想把 不区分大小写匹配 struts 的字符串替换为 <font color='red'>匹配字符串</font>
。
实现方式
public static String IgnoreCaseReplace(String source, String patternstring) {
Pattern p = Pattern.compile(patternstring, Pattern.CASE_INSENSITIVE);
Matcher mc = p.matcher(source);
StringBuffer sb = new StringBuffer();
while (mc.find()) {
mc.appendReplacement(sb, "<font color='red'>" + mc.group() + "</font>");
}
mc.appendTail(sb);
return sb.toString();
}
输出结果如下:
<font color='red' >struts</font> <font color='red' >StrUts</font> hibernate
原理解析
不区分大小写
Pattern.CASE_INSENSITIVE:启用不区分大小写的匹配。
Pattern p = Pattern.compile(patternstring, Pattern.CASE_INSENSITIVE);
默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII 字符集中的字符。可以通过指定 UNICODE_CASE 标志连同此标志来启用 Unicode 感知的、不区分大小写的匹配。
通过嵌入式标志表达式 (?i) 也可以启用不区分大小写的匹配。
指定此标志可能对性能产生一些影响。
使用示例:
public static String test() {
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
StringBuffer buf = new StringBuffer();
while (m.find()) {
buf.append(m.group()+"\t");
}
return buf.toString();
}
输出:
java Java JAVa JaVa JAVA Java
正则替换
以下两个是 java.util.regex.Matcher
类中的方法:
matcher.appendReplacement(sb, replaceContent);
matcher.appendTail(sb);
方法说明:
appendReplacement 方法:sb 是一个 StringBuffer,replaceContext 待替换的字符串
这个方法会把匹配到的内容替换为 replaceContext,并且把从上次替换的位置到这次替换位置之间的字符串也拿到,然后,加上这次替换后的结果一起追加到 StringBuffer 里。
appendTail 方法:sb 是一个 StringBuffer
这个方法是把最后一次匹配到内容之后的字符串追加到 StringBuffer 中。
两个方法一起使用就可以达到所有替换或者替换第一个。
所有替换:
while(m.find()){
m.appendReplacement(sb,replaceContext);
}
m.appendTail(sb);
替换第一个:
if (matcher.find()){
matcher.appendReplacement(sb, replaceContext);
}
matcher.appendTail(sb);
相关文章