Java使用正则提取文章的@信息

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>。
	}
}