`
jsczxy2
  • 浏览: 1255500 次
  • 性别: Icon_minigender_1
  • 来自: 常州
文章分类
社区版块
存档分类
最新评论

JAVA关键字替换

    博客分类:
  • java
阅读更多
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

/**
 * 关键字替换类
 * 
 */
public class KeywordFilterService {
	private static final char endWord = (char) (1);
	@SuppressWarnings("unchecked")
	private static Map<Character, HashMap> filterMap = new HashMap<Character, HashMap>(1024);
	private static List<String> filterWordList = new ArrayList<String>();
	private static List<String> replaceWordList = new ArrayList<String>();

	@SuppressWarnings("unchecked")
	public void init() {
		filterMap.clear();
		filterWordList.clear();
		replaceWordList.clear();
		// 加载过滤词库
		filterWordList.add("唉呀妈呀");
		replaceWordList.add("xxxx");
		filterWordList.add("唉呀");
		replaceWordList.add("oo");
		if (filterWordList.size() > 0) {
			for (String filterWord : filterWordList) {
				char[] charArray = filterWord.trim().toCharArray();
				int len = charArray.length;
				if (len > 0) {
					Map<Character, HashMap> subMap = filterMap;
					for (int i = 0; i < len - 1; i++) {
						Map<Character, HashMap> obj = subMap.get(charArray[i]);
						if (obj == null) {
							// 新索引,增加HashMap
							int size = (int) Math.max(2, 16 / Math.pow(2, i));
							HashMap<Character, HashMap> subMapTmp = new HashMap<Character, HashMap>(size);
							subMap.put(charArray[i], subMapTmp);
							subMap = subMapTmp;
						} else {
							// 索引已经存在
							subMap = obj;
						}
					}
					// 处理最后一个字符
					Map<Character, HashMap> obj = subMap.get(charArray[len - 1]);
					if (obj == null) {
						// 新索引,增加HashMap,并设置结束符
						int size = (int) Math.max(2, 16 / Math.pow(2, len - 1));
						HashMap<Character, HashMap> subMapTmp = new HashMap<Character, HashMap>(size);
						subMapTmp.put(endWord, null);
						subMap.put(charArray[len - 1], subMapTmp);
					} else {
						// 索引已经存在,设置结束符
						obj.put(endWord, null);
					}
				}
			}
		}
	}

	// 返回是否包含需要过滤的词,匹配到最短的关键词就返回结果
	@SuppressWarnings("unchecked")
	public static boolean hasFilterWord(String info) {
		if (StringUtils.isBlank(info) || filterMap.size() == 0) {
			return false;
		}
		char[] charArray = info.toCharArray();
		int len = charArray.length;
		for (int i = 0; i < len; i++) {
			int index = i;
			Map<Character, HashMap> sub = filterMap.get(charArray[index]);
			while (sub != null) {
				if (sub.containsKey(endWord)) {
					// 匹配结束
					return true;
				} else {
					index++;
					if (index >= len) {
						// 字符串结束
						return false;
					}
					sub = sub.get(charArray[index]);
				}
			}
		}
		return false;
	}

	// 将字符串中包含的关键词过滤并替换为指定字符串,然后退回替换后的字符串
	// 尽量匹配最长的关键词再替换
	@SuppressWarnings("unchecked")
	public static String getFilterString(String info) {
		if (StringUtils.isBlank(info) || filterMap.size() == 0) {
			return info;
		}
		char[] charArray = info.toCharArray();
		int len = charArray.length;
		String newInfo = "";
		int i = 0;
		String oldInfo = "";
		while (i < len) {
			int end = -1;
			int index;
			Map<Character, HashMap> sub = filterMap;
			for (index = i; index < len; index++) {
				sub = sub.get(charArray[index]);
				if (sub == null) {
					// 匹配失败,将已匹配的最长字符进行替换
					if (end == -1) {
						// 没匹配到任何关键词
						newInfo += charArray[i];
						i++;
						break;
					} else {
						// 将最长匹配字符串替换为特定字符
						for (int j = i; j <= end; j++) {
							oldInfo += charArray[j];
						}
						newInfo = newInfo + replaceWordList.get(filterWordList.indexOf(oldInfo));
						oldInfo = "";
						i = end + 1;
						break;
					}
				} else {
					if (sub.containsKey(endWord)) {
						// 匹配
						end = index;
					}
				}
			}
			if (index >= len) {
				// 字符串结束
				if (end == -1) {
					// 没匹配到任何关键词
					newInfo += charArray[i];
					i++;
				} else {
					// 将最长匹配字符串替换为特定字符
					for (int j = i; j <= end; j++) {
						oldInfo += charArray[j];
					}
					newInfo = newInfo + replaceWordList.get(filterWordList.indexOf(oldInfo));
					oldInfo = "";
					i = end + 1;
				}
			}
		}
		return newInfo;
	}

	public static void main(String[] args) {
		KeywordFilterService filterService = new KeywordFilterService();
		filterService.init();
		System.out.println(filterService.getFilterString("唉呀妈呀aa你妈呀唉呀呀呀唉呀呀呀唉呀呀妈呀唉呀妈呀呀呀呀唉呀呀呀唉呀呀"));
	}
}

 

分享到:
评论

相关推荐

    POI word替换关键字,转PDF

    java 对word关键字替换,可替换word表格中的关键字,word转PDF

    高效关键字过滤java源码

    最近项目中要用到关键字过滤,就参考网上的算法自己写了个关键字过滤的java代码,思路如下: 将关键词的第1个字作为hashMap的索引,第2个字放到另一个hashMap中,...2.执行1万次替换关键字的操作耗时170ms 3.内存占用3K

    poi替换word文件关键字为文字或者图形

    将模板word文件中的关键字替换为其他文字或者图形。注意:word模板保存的时候一定得注意去掉拼写检查等插件,不然可能会造成无法识别而不能替换

    java关键字Synchronized详解

    ava中的关键字synchronized是一种用于实现线程同步的机制。它可以确保在同一时刻,只有一个线程能够访问被synchronized修饰的代码块或方法。这种机制可以有效地避免多线程环境下的数据竞争和不一致问题。 在Java中...

    java poi 替换word文本

    java poi 实现word文本的替换,支持doc和docx格式的文本替换

    关键字过滤

    java编写的匹配关键字,并替换关键字,提供关键字设置,替换敏感词 java编写的匹配关键字,并替换关键字,提供关键字设置,替换敏感词 java编写的匹配关键字,并替换关键字,提供关键字设置,替换敏感词 java编写的...

    用java替换txt里的文字

    NULL 博文链接:https://song571377.iteye.com/blog/2120192

    POI替换word模板中的关键字

    通过POI可实现根据word模板替换文中或者表格的关键字(包括给定表头动态追加表格)。业务需求我是在模板中直接插入图片(例如衬于文字下方),所有代码中没有插入图片代码。

    itext-pdf-replace.zip

    pdf使用itext实现关键字替换 使用 #&lt;name&gt; 等关键字 替换成任意的字符,单个替换 批量替换

    Java读写docx文档所需jar包完整版

    Java读写docx文档时所需jar包完整版,包含所必需的所有jar包,相关代码在博客中有具体描述,可读取并替换文档需要被替换的内容

    部分关键字过滤,防止用户使用一些不合理的名称注册

    键字过滤功能自然无比重要,但是如果要在代码中对每个输入进行检查和替换则会是一件非常费神费事的事情。尤其是如果网站已经有了一定规模,用户输入功能已经遍及各处,而急需对所有输入进行关键字过滤时,上述做法更...

    替换word关键字相关的jar包

    替换word关键字相关的jar包

    Java实现文件内容replace

    对指定目录下的一篇文本文档实现关键字的替换,或者对图片等其他文件进行替换

    java开发中常用的jar包,很方便

    有MD5加密,创建数据库连接池、非法关键字替换等等,统统在里面

    java实现word表格指定位置盖章,并且设置章悬浮于文字之上

    java实现word表格指定位置盖章,并且设置章悬浮于文字之上,达到跟用实体章在A4纸上盖章一样的效果

    Java的this关键字的使用与方法的重载相关知识

    主要介绍了Java的this关键字的使用与方法的重载相关知识,是Java入门学习中的基础知识,需要的朋友可以参考下

    .Net平台高性能关键字过滤组KFilter.zip

    如ava,java显然不是属于AV这个关键字范围。 使用 KFilter使用起来非常方便,只需要创建Keyword对象即可 1Keyword kw = new Keyword();2kw.Add("av");3kw.Matchs("java"); 在添加关键字后就可以进行匹配操作...

    Java程序编辑器.rar

    该程序是一个图形界面的java文档编辑器,其界面主要采用了awt包, 程序实现了文本编辑器的基本功能有:新建文件、打开文件、文件保存、文件另存为、剪切、复制、粘贴、删除、查找/替换、改变字体大小,另外还利用Time...

    rename.zip

    目前已实现:文件的字典映射重命名(可以配合里面的打印字典模板的方式来构造字典),文件全量重命名以及关键字替换重命名。使用方法请大家参考readme文件,请使用markdown工具查看,推荐使用Typora。

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    9.2.7 替换字符串中的内容 226 9.2.8 String对象——磐石刻字 227 9.3 String类的最佳拍档——StringBuffer类 227 9.3.1 StringBuffer:专业操纵字符 228 9.3.2 String和StringBuffer一个都不能少 229 9.4 最...

Global site tag (gtag.js) - Google Analytics