问题描述:最近在搭建一个开源平台网站,在做一个简单搜索的功能,需要将搜索到的结果中被匹配的字符串添加不一样的颜色,但是又不破坏被匹配的字符串。
使用的方法是替换被匹配的字符串加上font标签。但是搜索出来的英文结果却没有那么理想。
原因分析:数据库查询使用like的时候是不区分大小写的,而java替换字符串时是区分大小写的,因此搜索出来的结果好多都没有加上font标签。
解决方法:使用强大的正则表达式。java中操作正则表达式的包为java.util.regex 包,主要由三个类所组成:Pattern、Matcher 和 PatternSyntaxException。
1、首先需要找到要被匹配的字符串,并且不区分大小写
代码:
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(str);
2、然后使用find方法,查找字符串的起始位置。
代码:
while (matcher.find()) { String match = str.substring(matcher.start() + len, matcher.end() + len); str = str.replaceFirst(match, "<font color='red'>" + match+ "</font>"); len = len + s.length(); }
最后的代码:
package test2; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { /** * 不区分大小写匹配字符串 * 并将被匹配字符串中的字符串加上一些东西 。 * 保持被匹配字符串中的字符串不变 * * @param args */ public static void main(String[] args) { String str = "Java JAva JAVA JavA"; String regex = "JAva"; //保存你要添加的html代码的长度 int len = 0; String s = "<font color='red'></font>"; //不区分大小写匹配字符串 Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(str); //循环查找,可能匹配到的不止一个字符串 while (matcher.find()) { //截取字符串,临时保存匹配到的字符串 //起始位置和结束位置都要加一个len长度 String match = str.substring(matcher.start() + len, matcher.end() + len); //替换首次找到的字符串 str = str.replaceFirst(match, "<font color='red'>" + match + "</font>"); //len需要加上s长度 len = len + s.length(); } System.out.println(str); } }
程序运行结果:
<font color='red'>Java</font> <font color='red'>JAva</font> <font color='red'>JAVA</font> <font color='red'>JavA</font>
有什么更好的处理办法请留言推荐,谢谢