不区分大小写匹配字符串,并在不改变被匹配字符串的前提下添加html标签
问题描述:最近在搭建一个开源平台网站,在做一个简单搜索的功能,需要将搜索到的结果中被匹配的字符串添加不一样的颜色,但是又不破坏被匹配的字符串。
使用的方法是替换被匹配的字符串加上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>
有什么更好的处理办法请留言推荐,谢谢
不区分大小写匹配字符串,并在不改变被匹配字符串的前提下添加html标签的更多相关文章
- Mysql 查询条件中字符串尾部有空格也能匹配上的问题
一.表结构 TABLE person id name 1 你 2 你(一个空格) 3 你(二个空格) 二.查询与结果 select * from person where `name` = ? 无论 ...
- 如何在RichTextBox中改变多个字符串的颜色以及字体
目标:传入目标富文本框以及需要查找的字符串,如果文本框中存在字符串,则改变其颜色和字体 可能因为这个问题比较简单,在网上找了很久,也没有一个好的方法.少有的一些方法,也只是改变第一个找到的字符串的颜色 ...
- 【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配...
37.(字符串)有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环, ...
- Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能
Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能. 下面是个例子: import org.junit.Test; import java. ...
- Mysql字符串截取,去掉时间,匹配日期等于今日
Mysql字符串截取,去掉时间,匹配日期等于今日 方案一 select time from jsb where date(time)=date(now()); 方案二 ));
- 改变对象的字符串显示__str__repr
改变对象的字符串显示 # l=list('hello') # # print(l) # file=open('test.txt','w') # print(file) class Foo: def _ ...
- VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线, 匹配中文,中文正则,倒数第二列, 匹配任意一个字符 :
VIM 用正则表达式 批量替换文本,多行删除,复制,移动 在VIM中 用正则表达式 批量替换文本,多行删除,复制,移动 :n1,n2 m n3 移动n1-n2行(包括n1,n2)到n3行之下: ...
- Swift 2.0 字符串学习笔记(建议掌握OC字符串知识的翻阅)
自己公司开现在使用OC语言在写,但Swift似乎是苹果更推荐使用的开发语言,估计也是未来开发的趋势,自己以前有接触swift,但又由于公司的项目赶,也没有时间去好好地学习这款开发语言.现在年底了,项目 ...
- char型字符串(数组)与string型字符串 指针与引用
一.常指针: int *const p; //指针不可改变,但是指针指向的数据可以改变. 指向常量的指针: const int *p; //指针可以改变,但是指针指向的数据不可以改变. 指 ...
随机推荐
- 【BZOJ 1497】 [NOI2006]最大获利
Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一 ...
- Javascript中Array.prototype.map()详解
map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数.callback 每次执行后的返回值组合起来形成一个新数组. callback 函数只会在有值的索引上被调用:那些从来没被赋 ...
- spoj 2178
好水...... #include<cstdio> #include<cstdlib> #include<cstring> #include<algorith ...
- iOS socket编程 第三方库 AsyncSocket(GCDAsyncSocket)
Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Clien ...
- MCM试题原文及翻译 AB题 2014美国数学建模竞赛
MCM试题原文及翻译 AB题 2014美国数学建模竞赛 原创翻译,如有瑕疵,敬请谅解. 转载请注明:过客小站 » MCM试题原文及翻译 AB题 2014美国数学建模竞赛 PROBLEM A: The ...
- iOS开发笔记--宏定义的黑魔法 - 宏菜鸟起飞手册
宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在 ...
- SSH hibernate 使用时最好添加访问数据库的编码
SSH hibernate 使用时最好添加访问数据库的编码 如下所示:第13行为设置hibernate访问数据库的编码(&是&的转义序列) <!DOCTYPE hibernate ...
- Qt xcode wrapper Qios OpenFly
https://github.com/richardmg/QtWrapper https://github.com/richardmg/qios https://github.com/richardm ...
- while ((ch = getchar()) != EOF)中ch定义为char还是int型?cin、scanf等如何结束键盘输入
2013-07-09 18:55:42 EOF是文件的结束符,具体可以作为文本文件的结束符,也可以作为键盘输入char类型数据时的结束符.对于不同的系统,EOF的定义可能不同,一般定义为-1.因为ch ...
- S5P4418 uboot 分析
瘋耔新浪微博: http://weibo.com/cpjphone 一: 1◑ 从链接脚本文件u-boot.lds('/opt/4418-source/android/u-boot' )中可以找到 ...