java实现敏感字过滤工具类

2023-11-04

实现敏感字的过滤思路:

1. 读取敏感词库;

2. 确认字符串中是否有敏感词库中的敏感词

以下提供判断是否有敏感词的方法boolean checkSenstiveWord()和将敏感词转换为*字符的方法String filterInfoAfter().

工具类:



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 
 * blog.csdn.net/hubiao_0618/article/details/45076871
 * 
 *
 */
public class SensitiveWord {
	private StringBuilder replaceAll;// 初始化
	private String encoding = "UTF-8";
	private String replceStr = "*";
	private int replceSize = 500;
	private static final String fileName = "CensorWords.txt";
	private List<String> arrayList;
	public Set<String> sensitiveWordSet;
	public List<String> sensitiveWordList;

	public SensitiveWord(String replceStr, int replceSize) {
		this.replceStr = fileName;
		this.replceSize = replceSize;
	}

	public SensitiveWord() {
	}

	public StringBuilder getReplaceAll() {
		return replaceAll;
	}

	public void setReplaceAll(StringBuilder replaceAll) {
		this.replaceAll = replaceAll;
	}

	public String getReplceStr() {
		return replceStr;
	}

	public void setReplceStr(String replceStr) {
		this.replceStr = replceStr;
	}

	public int getReplceSize() {
		return replceSize;
	}

	public void setReplceSize(int replceSize) {
		this.replceSize = replceSize;
	}

	public List<String> getArrayList() {
		return arrayList;
	}

	public void setArrayList(List<String> arrayList) {
		this.arrayList = arrayList;
	}

	public String getEncoding() {
		return encoding;
	}

	public void setEncoding(String encoding) {
		this.encoding = encoding;
	}

	/**
	 * 将敏感字转换为*符号
	 * 
	 * @param str
	 * @return
	 */
	public String filterInfo(String str) {
		sensitiveWordSet = new HashSet<String>();
		sensitiveWordList = new ArrayList<>();
		StringBuilder buffer = new StringBuilder(str);
		HashMap<Integer, Integer> hash = new HashMap<Integer, Integer>(arrayList.size());
		String temp;
		for (int x = 0; x < arrayList.size(); x++) {
			temp = arrayList.get(x);
			int findIndexSize = 0;
			for (int start = -1; (start = buffer.indexOf(temp, findIndexSize)) > -1;) {
				findIndexSize = start + temp.length();
				Integer mapStart = hash.get(start);
				if (mapStart == null || (mapStart != null && findIndexSize > mapStart)) {
					hash.put(start, findIndexSize);
				}
			}
		}
		Collection<Integer> values = hash.keySet();
		for (Integer startIndex : values) {
			Integer endIndex = hash.get(startIndex);
			String sensitive = buffer.substring(startIndex, endIndex);
			if (!sensitive.contains("*")) {
				sensitiveWordSet.add(sensitive);
				sensitiveWordList.add(sensitive);
			}
			buffer.replace(startIndex, endIndex, replaceAll.substring(0, endIndex - startIndex));
		}
		hash.clear();
		return buffer.toString();
	}

	/**
	 * 初始化读取铭感文件库
	 */
	public void InitializationWork() {
		replaceAll = new StringBuilder(replceSize);
		for (int x = 0; x < replceSize; x++) {
			replaceAll.append(replceStr);
		}
		arrayList = new ArrayList<String>();
		InputStreamReader read = null;
		BufferedReader bufferedReader = null;
		try {
			read = new InputStreamReader(SensitiveWord.class.getClassLoader().getResourceAsStream(fileName), encoding);
			bufferedReader = new BufferedReader(read);
			for (String txt = null; (txt = bufferedReader.readLine()) != null;) {
				if (!arrayList.contains(txt))
					arrayList.add(txt);
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != bufferedReader)
					bufferedReader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if (null != read)
					read.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 判断是否有敏感词汇
	 * 
	 * @param str
	 * @return
	 */
	public static boolean checkSenstiveWord(String str) {
		// 初始敏感词库
		SensitiveWord sw = new SensitiveWord();
		sw.InitializationWork();
		str = sw.filterInfo(str);
		if (str.contains("*")) {
			return true;
		}
		return false;
	}

	public static String filterInfoAfter(String str) {
		// 初始敏感词库
		SensitiveWord sw = new SensitiveWord();
		sw.InitializationWork();
		str = sw.filterInfo(str);
		return str;
	}

	
}

测试类



public class WordTest {
	public static void main(String[] args) {
		long startNumer = System.currentTimeMillis();
		String str = "玉蒲团哦检票口还是看黑白电视不娱乐透视";
		boolean flag = SensitiveWord.checkSenstiveWord(str);
		System.out.println("字符串的长度为:" + str.length());
		str = SensitiveWord.filterInfoAfter(str);
		System.out.println("含有敏感词汇:" + flag);
		long endNumber = System.currentTimeMillis();
		System.out.println("消耗时间为" + (endNumber - startNumer) + "ms");
		System.out.println("转换后的字符串为:\n" + str);
	}

}

敏感词库放的位置是再src根目录下. 

敏感词汇可以去这个位置下载链接:

https://pan.baidu.com/s/1fbmRFhiIdFsMOz5eOJa7eA 密码:qi2b

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java实现敏感字过滤工具类 的相关文章

  • IntelliJ IDEA+SpringBoot+Tomcat部署404问题

    因为并行开发 后端一直拿不出接口 我不得不自己做Mock 为了完成网络请求逻辑 我使用Idea做模拟接口 后来发现 使用Idea创建的SpringBoot项目在软件内部的虚拟Tomcat上面可以正常运行 但是因为要做一些WebSocket和
  • 苹果笔记本计算机管理员删除,如何删除一个管理员?

    注销要删除的管理员帐户 再以管理员帐户登入 然后跟下面方法 如果您是管理员 则可以删除您不再想让其可访问电脑的用户 删除用户时 您可以存储该用户的个人文件夹 包含用户的文件和设置 或删除该个人文件夹 选取苹果菜单 gt 系统偏好设置 然后点
  • Python反反爬之JS混淆---动态Cookie(持续更新详细教程)

    写在前面 第一题JS混淆 源码乱码 经过上一题的练习JS混淆 源码乱码 我们已经对JS混淆有了大致的了解 这次我们再来练习一道同类型的题目 只不过这次是动态Cookie 首先 让我们了解一下什么是Cookie Cookie 并不是它的原意
  • lua中的常用字符串处理方法

    对lua中string类库中常用方法总结一二 1 数字和字符串相加减lua自动转换 2 得到字符串的长度 3 string byte 返回字符的内部数字编码 ASCII码 4 string char 返回和参数数量相同长度的字符串 其中每个
  • LeetCode202.快乐数(Python)

    题目 解题思路 运用哈希表 将各个位数进行平方 将得到的数进行判断 如果为1输出True 如果不为1 判断是否重复了 如果重复输出False 如果没有重复 进行各个位数平方 反复以上操作 class Solution def isHappy
  • [转]Smartgit :Remove Discard Delete

    Smartgit Remove Discard Delete https blog csdn net u010272085 article details 85039801 Remove 从仓库中移除选中的文件或目录 可通过Discard还
  • C# this.Invoke()的作用与用法、不阻塞UI界面线程的延时函数

    一 this Invoke 的作用与用法 不阻塞UI界面线程的延时函数 Invoke 的作用是 在应用程序的主线程上执行指定的委托 一般应用 在辅助线程中修改UI线程 主线程 中对象的属性时 调用this Invoke 在多线程编程中 我们
  • CH9-网络编程

    目标 了解HTTP协议通信简介 能够说出什么是HTTP协议 掌握HttpURLConnection的使用方法 能够使用HttpURLConnection访问网络 掌握WebView控件的使用方式 能够使用WebView控件加载不同的网页 掌
  • 机器学习(七):主成分分析PCA降维_Python

    六 PCA主成分分析 降维 github地址 https github com lawlite19 MachineLearning Python 全部代码 1 用处 数据压缩 Data Compression 使程序运行更快 可视化数据 例
  • 【目标检测-YOLO】YOLOv5-5.0v-数据处理(第三篇)

    前文链接 YOLOv5 v5 0 yolov5s网络架构详解 第一篇 星魂非梦的博客 CSDN博客 YOLOv5 5 0v yaml 解析 第二篇 星魂非梦的博客 CSDN博客 1 性能分析 YOLOv5 P6 models 4 outpu
  • 数据隐私与安全在大数据时代的挑战与应对

    文章目录 数据隐私的挑战 数据安全的挑战 应对策略和方法 1 合规和监管 2 加密技术 3 匿名化和脱敏 4 安全意识培训 5 隐私保护技术 结论 个人主页 程序员 小侯 CSDN新晋作者 欢迎 点赞 评论 收藏 收录专栏 大数据系列 文章
  • 国内“风口”转变,中国游戏公司纷纷“外逃”,东南亚是个好去处

    中国游戏开发商正在加强对国际市场 特别是东南亚市场的承诺 因为他们的国内公司正在努力应对更困难的中国市场 以便实施在下一阶段发展布局 根据移动应用市场情报公司Sensor Tower的一份报告 按收入排名的前100名全球移动游戏中 有39款
  • String类型的时间转换成BigDecimal类型

    private BigDecimal timeformat String time throws ParseException SimpleDateFormat formatter new SimpleDateFormat yyyy MM
  • Eureka中的服务状态显示UNKOWN(1)

    Spring cloud在加入Config配置中心后 Eureka中的服务状态显示为UNKOUNW 1 Eureka的client端显示如下注册状态为204 重新注册 Eureka服务端 Eureka client端 2018 11 02
  • pom文件解读

    一 pom文件解读
  • Visio+Latex 插入EPS等矢量图

    Latex插入单栏 或者跨栏 的图片 在figure后面加个 即可 即figure begin figure h centering includegraphics width linewidth Figure1 caption Whate
  • CentOS 7通过samba实现与Windows共享文件夹

    Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件 由服务器及客户端程序构成 SMB Server Messages Block 信息服务块 是一种在局域网上共享文件和打印机的一种通信协议 它为局域网内的不同计算机之间提供
  • 【数据结构与算法——TypeScript】树结构Tree

    数据结构与算法 TypeScript 树结构 Tree 认识树结构以及特性 什么是树 真实的树 相信每个人对现实生活中的树都会非常熟悉 我们来看一下树有什么特点 树通常有一个根 连接着根的是树干 树干到上面之后会进行分叉成树枝 树枝还会分叉
  • OpenCV实现人脸识别

    该程序对头像很小的图片效果不是很好 VS2017 OpenCV3 5 主要步骤 1 读取图像 2 转为灰度图 3 直方图均衡化 增加对比度 4 载入分类器 5 检测关于脸部位置 include

随机推荐

  • 地形平滑算法

    地形平滑算法 2013 06 20 18 33 2486人阅读 评论 0 收藏 举报 分类 OGRE 41 C C 10 版权声明 本文为博主原创文章 未经博主允许不得转载 拉出来的地下不平滑怎么办 笨办法就是美工一个顶点一个顶点的调整 而
  • AWB实现流程

    简介 本篇谈论下对AWB算法的调查和预研工作 内容概述 所谓AWB也就是自动白平衡的意思 白平衡在相机中很常见 主要是和色温 色彩还原 色调调整相关 当白平衡设置不佳的时候 常会出现如下这些情况 在日光灯的房间里拍摄的影像会显得发绿 在室内
  • UE5项目打包发布Windows需要安装插件

    一 下图为UE5项目打包发布Windows的安装路劲 前面感叹号为未安装插件 二 打包前的其他可有可无设置 1 编辑Edit 项目设置Project Settings 2 平台Platforms Windows 三 安装路径 1 搜索vis
  • 群晖(docker图形化界面)使用 SpeedTest 测速

    群晖 docker图形化界面 使用 SpeedTest 测速 博主博客 https blog uso6 com https blog csdn net dxk539687357 本文主要介绍在群晖中安装 speedtest 进行网络测速 一
  • 会话跟踪技术:会话Cookie,URL重写和HttpSession

    一 会话跟踪 session tracking 技术 会话是客户端发送请求 服务器返回响应的连接时间段 HTTP是无状态协议 每次都是单独连接 不能维持客户的上下文信息 会话跟踪技术是用于维持客户端和服务器端通信信息的技术 三种典型客户端会
  • 云计算介绍之云计算存储(1)

    文章目录 云计算存储 1 存储架构 1 1存储概念 1 2系统组成 1 系统硬件 2 存储软件 3 存储方案 1 3存储分类 1 3 1 开放系统的存储 1 外挂存储 a Fabric Attached Storage 网络存储 FAS 1
  • TinyPerson数据集json文件改写为xml文件

    TinyPerson NWPU VHR 10或其他同理 数据集文件改写为VOC类型的xml文件 代码转python实现 创作不易 点个赞吧 文章目录 TinyPerson NWPU VHR 10或其他同理 数据集文件改写为VOC类型的xml
  • CentOS 6.3下rsync服务器的安装与配置

    一 rsync 简介 Rsync remote synchronize 是一个远程数据同步工具 可通过LAN WAN快速同步多台主机间的文件 也可以使用 Rsync 同步本地硬盘中的不同目录 Rsync 是用于取代rcp的一个工具 Rsyn
  • WINDOWS SERVER 2012证书服务安装配置

    WINDOWS SERVER 2012证书服务安装配置 首先需要下载一个windows server 2012的镜像 安装虚拟机 来进行证书服务安装之前的准备 在进行安装证书服务之前 首先应该安装配置域服务 否则安装证书服务无法正常安装配置
  • python好学吗?0基础学习python需要那些准备

    Python是一种计算机程序设计语言 你可能已经听说过很多种流行的编程语言 比如非常难学的C语言 非常流行的Java语言 适合初学者的Basic语言 适合网页编程的JavaScript语言等等 那Python是一种什么语言 首先 我们普及一
  • kubernetes1.20版本启用ipvs模式

    在1 19版本之前 kubeadm部署方式启用ipvs模式时 初始化配置文件需要添加以下内容 apiVersion kubeproxy config k8s io v1alpha1 kind KubeProxyConfiguration f
  • (css样式穿透详解)::v-deep的使用

    目录 背景 使用 1 当项目中使用的 css 原生样式 需要使用 gt gt gt 深度选择器来修改 外用第三方组件的样式 2 当项目中使用的 css 扩展语言是 less 需要使用 deep 或者 v deep 深度选择器来修改 外用第三
  • TypeScript超详细入门教程(上)

    TypeScript超详细入门教程 上 01 开篇词 Hello TypeScript 01 开篇词 Hello TypeScript 更新时间 2019 10 30 13 49 46 既然我已经踏上这条道路 那么 任何东西都不应妨碍我沿着
  • ios申请真机调试( xcode 5)详细解析

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 已经有开发证书的直接跳过第一步 第一步 申请 开发证书 进入苹果开发者99美元账号 选择 Certificates Identifiers Profiles 关于 Cert
  • BTC-协议

    防范 double spending attack Distribute consensus distributed hash table 分布式共识 FLP impossibility result 在一个异步的系统里 网络时延没有上限
  • cython优化代码过程问题及解决总结

    1 同样cdef的矩阵还是在Python平台 还是黄色 源 问题 解决1 2 3 1 加上修饰符 cython boundscheck False cython wraparound False 2 数组索引方式 注意这里nodePot0是
  • avue 表单远程搜索、模糊查询

    关于avue的模糊下拉 直接上代码 computed option return emptyBtn false submitBtn false menuSpan 8 menuBtn false column label 经销商名称 labe
  • 编译原理------词法分析器C/C++代码实现

    一 实验目的 设计 编制并调试一个词法分析程序 加深对词法分析原理的理解 二 实验内容 2 1 待分析的简单的词法 1 关键字 begin if then while do end 所有的关键字都是小写 2 运算符和界符 lt lt lt
  • 剑指 Offer 11. 旋转数组的最小数字、12.矩阵中的路径

    剑指 Offer 11 12 旋转数组的最小数字 思路 矩阵中的路径 回溯法 旋转数组的最小数字 旋转数组的最小数字 思路 就是找旋转点 二分查找 去除两端的元素 package swordPointingToTheOffer public
  • java实现敏感字过滤工具类

    实现敏感字的过滤思路 1 读取敏感词库 2 确认字符串中是否有敏感词库中的敏感词 以下提供判断是否有敏感词的方法boolean checkSenstiveWord 和将敏感词转换为 字符的方法String filterInfoAfter 工