前言

现在几乎所有的网站再发布带有文字信息的内容时都会要求过滤掉发动的、不健康的、影响社会安定的等敏感词汇,这里为大家提供了可以是现在这种功能的解决方案

第一种方式

创建敏感词汇文件;首先需要准备一个txt格式的文件用于存放需要过滤的敏感词汇,这个文件放到resources资源文件的根目录

代码如下

package com.xxxx.service;

import lombok.Data;

import org.springframework.stereotype.Service;

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;

/**

* 敏感词汇service

*

* @author

* @date

*/

@Data

@Service

public class SensitiveWordService {

private StringBuilder replaceAll;

/**

* 编码

*

* 在读敏感词汇文件时需要用到

*/

private String encoding = "UTF-8";

/**

* 替换字符窜

*

* 用于替换敏感词汇的字符窜

*/

private String replceStr = "*";

/**

*单次替换的敏感词汇的长度

*/

private int replceSize = 500;

/**

* 敏感词汇文件

*

* 此文件放在资源文件的根目录下

*/

private String fileName = "censorwords.txt";

private List arrayList;

/**

* 包含的敏感词列表,过滤掉重复项

*/

public Set sensitiveWordSet;

/**

* 包含的敏感词列表,包括重复项,统计次数

*/

public List sensitiveWordList;

/**

* 移除敏感词汇

*

* @param str 需要过滤的字符窜

*

* @return 过滤之后的字符窜

*/

public String removeSensitiveWord(String str){

SensitiveWordService sw = new SensitiveWordService("censorwords.txt");

sw.InitializationWork();

return sw.filterInfo(str);

}

/**

* 拦截信息

*

* 过滤掉敏感词汇的方法

*

* @param str 将要被过滤信息

*

* @return 过滤后的信息

*/

public String filterInfo(String str) {

sensitiveWordSet = new HashSet();

sensitiveWordList= new ArrayList<>();

StringBuilder buffer = new StringBuilder(str);

HashMap hash = new HashMap(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;){

//System.out.println("###replace="+temp);

findIndexSize = start+temp.length();//从已找到的后面开始找

Integer mapStart = hash.get(start);//起始位置

//满足1个,即可更新map

if(mapStart == null || (mapStart != null && findIndexSize > mapStart)){

hash.put(start, findIndexSize);

//System.out.println("###敏感词:"+buffer.substring(start, findIndexSize));

}

}

}

Collection values = hash.keySet();

for(Integer startIndex : values){

Integer endIndex = hash.get(startIndex);

//获取敏感词,并加入列表,用来统计数量

String sensitive = buffer.substring(startIndex, endIndex);

//System.out.println("###敏感词:"+sensitive);

if (!sensitive.contains("*")) {//添加敏感词到集合

sensitiveWordSet.add(sensitive);

sensitiveWordList.add(sensitive);

}

buffer.replace(startIndex, endIndex, replaceAll.substring(0,endIndex-startIndex));

}

hash.clear();

return buffer.toString();

}

/**

* 初始化敏感词库

*/

private void InitializationWork() {

replaceAll = new StringBuilder(replceSize);

for(int x=0;x < replceSize;x++)

{

replaceAll.append(replceStr);

}

//加载词库

arrayList = new ArrayList();

InputStreamReader read = null;

BufferedReader bufferedReader = null;

try {

read = new InputStreamReader(SensitiveWordService.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 args 参数

*/

public static void main(String[] args){

long startNumer = System.currentTimeMillis();

SensitiveWordService sw = new SensitiveWordService("censorwords.txt");

sw.InitializationWork();

//System.out.println("敏感词的数量:" + arrayList.size());

String str = "你好呀,我这里有敏感词汇,来过滤我呀";

System.out.println("被检测字符串长度:"+str.length());

str = sw.filterInfo(str);

long endNumber = System.currentTimeMillis();

//System.out.println("语句中包含敏感词的个数为:" + sensitiveWordSet.size() + "。包含:" + sensitiveWordSet);

//System.out.println("语句中包含敏感词的个数为:" + sensitiveWordList.size() + "。包含:" + sensitiveWordList);

System.out.println("总共耗时:"+(endNumber-startNumer)+"ms");

System.out.println("替换后的字符串为:\n"+str);

System.out.println("替换后的字符串长度为:\n"+str.length());

}

/**

* 有参构造

*

* 文件要求路径在src或resource下,默认文件名为censorwords.txt

* @param fileName 词库文件名(含后缀)

*/

public SensitiveWordService(String fileName) {

this.fileName = fileName;

}

/**

* 有参构造

*

* @param replceStr 敏感词被转换的字符

* @param replceSize 初始转义容量

*/

public SensitiveWordService(String replceStr, int replceSize){

this.replceStr = fileName;

this.replceSize = replceSize;

}

/**

* 无参构造

*/

public SensitiveWordService(){

}

}

第二种方法

package com.xxxx.filters;

import java.io.IOException;

import java.io.InputStream;

import java.util.Enumeration;

import java.util.Properties;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

/**

* 【匹配度可以,速度较慢】

* Java关键字过滤:http://blog.csdn.net/linfssay/article/details/7599262

* @author ShengDecheng

*

*/

public class KeyWordFilter {

private static Pattern pattern = null;

private static int keywordsCount = 0;

// 从words.properties初始化正则表达式字符串

private static void initPattern() {

StringBuffer patternBuffer = new StringBuffer();

try {

//words.properties

InputStream in = KeyWordFilter.class.getClassLoader().getResourceAsStream("keywords.properties");

Properties property = new Properties();

property.load(in);

Enumeration> enu = property.propertyNames();

patternBuffer.append("(");

while (enu.hasMoreElements()) {

String scontent = (String) enu.nextElement();

patternBuffer.append(scontent + "|");

//System.out.println(scontent);

keywordsCount ++;

}

patternBuffer.deleteCharAt(patternBuffer.length() - 1);

patternBuffer.append(")");

//System.out.println(patternBuffer);

// unix换成UTF-8

// pattern = Pattern.compile(new

// String(patternBuf.toString().getBytes("ISO-8859-1"), "UTF-8"));

// win下换成gb2312

// pattern = Pattern.compile(new String(patternBuf.toString()

// .getBytes("ISO-8859-1"), "gb2312"));

// 装换编码

pattern = Pattern.compile(patternBuffer.toString());

} catch (IOException ioEx) {

ioEx.printStackTrace();

}

}

private static String doFilter(String str) {

Matcher m = pattern.matcher(str);

// while (m.find()) {// 查找符合pattern的字符串

// System.out.println("The result is here :" + m.group());

// }

// 选择替换方式,这里以* 号代替

str = m.replaceAll("*");

return str;

}

public static void main(String[] args) {

long startNumer = System.currentTimeMillis();

initPattern();

//String str = "我日,艹,fuck,你妹的 干啥呢";

System.out.println("敏感词的数量:" + keywordsCount);

String str = "你好呀,我这里有敏感词汇,来过滤我呀";

System.out.println("被检测字符串长度:"+str.length());

str = doFilter(str);

//高效Java敏感词、关键词过滤工具包_过滤非法词句:http://blog.csdn.net/ranjio_z/article/details/6299834

//FilteredResult result = WordFilterUtil.filterText(str, '*');

long endNumber = System.currentTimeMillis();

System.out.println("总共耗时:"+(endNumber-startNumer)+"ms");

System.out.println("替换后的字符串为:\n"+str);

//System.out.println("替换后的字符串为:\n"+result.getFilteredContent());

//System.out.println("替换后的字符串为1:\n"+result.getOriginalContent());

//System.out.println("替换后的字符串为2:\n"+result.getBadWords());

}

}

敏感词汇文件keywords.properties

java过滤关键字_java过滤敏感词汇相关推荐

  1. java 过滤字符串_java 过滤字符串方法实现

    这样过滤:"你TMD,也太缺德了吧"过滤后"你***,也太缺德了吧"把骂人的脏话过滤成*号 package test; import java.util.Has ...

  2. java class 关键字_java关键字及其作用

    一. 关键字总览: 访问控制 private protected public 类,方法和变量修饰符 abstract class extends final implements interface ...

  3. java 中关键字_java中关键字一览

    开始学习java了,今天学了java中的关键字,给大家分享以下. java中有50个关键字(含两个保留字),没有算true,false,null,简单一点,列个表格出来,仿照着:abstractcon ...

  4. 什么是java的关键字_java中常见的关键字

    什么是关键字呢? 概述:关键字就是在java语言中赋予特殊含义的单词 特点:1.组成的关键字的单词全是小写 2.常见的代码编辑器中,对关键字都有特殊的颜色标记 比如在idea中对关键字都有特殊的颜色标 ...

  5. java outer关键字_Java关键字

    Java关键字 Java关键字是编程语言里事先定义的,有特别意义的单词,Java语言中所有的关键字都是小写的英语单词.Java的关键字对Java的编译器有特殊的意义,它们用来表示一种数据类型,或者表示 ...

  6. java敏感词过滤源代码_Java实现敏感词过滤代码

    importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStr ...

  7. java 过滤中文_Java 过滤字母、数字和中文 正则表达式

    [java]代码库/** * @Title:FilterStr.java * @Package:com.you.dao * @Description:Java中过滤数字.字母和中文 * @Author ...

  8. java 6字节_java过滤四字节和六字节特殊字符

    java7版本中可以这样写: source.replaceAll("[\ud800\udc00-\udbff\udfff\ud800-\udfff]", "*" ...

  9. java emoji问号_java过滤emoji字符

    替换成问号: EmojiFilter.filterEmoji(str, "?"); import org.apache.commons.lang3.StringUtils; /** ...

  10. php中如何过滤关键字,PHP - 过滤关键字

    中文关键字过滤时使用的关键字文件为utf-8编码 格式为key1|key2|key3|.... 解决中文和英文匹配的一些问题 /** * 被禁止的关键字检测 * * @param string $st ...

最新文章

  1. 第一次接觸sbt會遇到的
  2. linux之sed用法
  3. JSON 基础解释.
  4. python冒泡排序算法时间复杂度为nlogn_Python版算法专题-1、冒泡排序
  5. 用Socket编写TCP程序(C/C++)(转)
  6. Boost:自定义vector的测试程序
  7. C++数组与指针的区别
  8. Nginx的HTTP运行时健康检查
  9. B1295 [SCOI2009]最长距离 最短路
  10. C# 打印自定义纸张设置
  11. umount卸载磁盘提示target is busy. (目标忙) 的问题解决方案
  12. [ Vue.js ] 报错 ‘scope‘ is defined but never used vue/no-unused-vars
  13. OpenWrt TL-WR841N WAN口down问题
  14. 服务器安装系统路径,裸金属服务器安装多路径软件
  15. C++并发编程(C++11到C++17)
  16. 数据标注自动化工具 - Snorkel【机器学习】
  17. 白云苍狗看复鹿 冥鸿相助见神龙
  18. 【已解决】阿里自动滑块 x5sec 解密 钉钉数据采集
  19. nova6se是华为鸿蒙系统吗,华为荣耀9x和nova6se哪个性价比高?_科技数码通
  20. 给大家分享几个靠写代码赚钱的方法

热门文章

  1. 应届生软件测试面经_应届生软件测试面试自我介绍
  2. SLAM方向国内有哪些优秀的公司?
  3. 职工信息管理系统—C语言工程实践
  4. html页面小宠物代码大全,宠物店网页设计html代码
  5. c语言程序谭浩强第二章,PDF版本_谭浩强c语言程序设计. 第二章 程序的灵魂-算法...
  6. 高等数理统计(part4)--充分统计量
  7. Word文件怎么快速查找关键词
  8. Visual Studio 2015的破解密钥
  9. 阅读 深入理解JVM虚拟机笔记一
  10. 归并排序时间复杂度分析