Java使用正则提取文章的@信息
在B/S社交应用中(论坛,博客),一般都允许通过@用户,来渲染一个已经存在的用户连接,而且该用户也会收到对应的通知消息。
使用正则来提取文章中的@信息
- 一般我们通过在@用户 后添加一个或者多个空格(标点符号也是可以的)来判断是@用户信息,还是普通的文本信息
- 仅仅需要一点基本的正则知识就可以搞定
- 在获取到解析的用户昵称后,可以根据昵称检索DB,判断是否存在,从而判断是否要进行
<a>
标签的渲染 - 在渲染完毕后,也可以给该用户发送被@的通知
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String content = "你好啊@KevinBlandy 这里是SpringBoot中文社区,@搞个大新闻 @Hello_Java开发者\r\n。";
/**
@(?<name>[a-zA-Z\\d_\\u4e00-\\u9fa5]{1,14})\\s+
@ 表示匹配以该符号开头的字符串
(?<name>[a-zA-Z\\d_\\u4e00-\\u9fa5]{1,14}) 表示用户昵称的规则为:大小写字母,汉字,数字以及下划线,1 - 14个字符。并且给该规则起了个名字叫做`name`
\\s+ 表示在符合昵称规则后,跟随了一个或者多个空格/换行
**/
Pattern pattern = Pattern.compile("@(?<name>[a-zA-Z\\d_\\u4e00-\\u9fa5]{1,14})\\s+");
Matcher matcher = pattern.matcher(content);
StringBuilder stringBuilder = new StringBuilder();
int lastIndex = 0;
while(matcher.find()) {
//匹配到的昵称(正则中定义的名称)
String name = matcher.group("name");
//昵称开始的角标
int start = matcher.start("name");
//截取昵称前面的字符串,从上一个昵称结束的角标开始截取
stringBuilder.append(content.substring(lastIndex,start));
//手动对昵称添加a标签,可以从DB根据name检索数据,然后添加href属性。
stringBuilder.append("<a>" + name + "</a>");
//记录昵称结束的角标
lastIndex = matcher.end("name");
}
//最后对所有@信息都添加了<a>
stringBuilder.append(content.substring(lastIndex)).toString();
System.out.println(stringBuilder.toString());
//你好啊<a>KevinBlandy</a>这里是SpringBoot中文社区,<a>搞个大新闻</a><a>Hello_Java开发者</a>。
}
}