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);