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你妈呀唉呀呀呀唉呀呀呀唉呀呀妈呀唉呀妈呀呀呀呀唉呀呀呀唉呀呀")); } }
相关推荐
java 对word关键字替换,可替换word表格中的关键字,word转PDF
最近项目中要用到关键字过滤,就参考网上的算法自己写了个关键字过滤的java代码,思路如下: 将关键词的第1个字作为hashMap的索引,第2个字放到另一个hashMap中,...2.执行1万次替换关键字的操作耗时170ms 3.内存占用3K
将模板word文件中的关键字替换为其他文字或者图形。注意:word模板保存的时候一定得注意去掉拼写检查等插件,不然可能会造成无法识别而不能替换
ava中的关键字synchronized是一种用于实现线程同步的机制。它可以确保在同一时刻,只有一个线程能够访问被synchronized修饰的代码块或方法。这种机制可以有效地避免多线程环境下的数据竞争和不一致问题。 在Java中...
java poi 实现word文本的替换,支持doc和docx格式的文本替换
java编写的匹配关键字,并替换关键字,提供关键字设置,替换敏感词 java编写的匹配关键字,并替换关键字,提供关键字设置,替换敏感词 java编写的匹配关键字,并替换关键字,提供关键字设置,替换敏感词 java编写的...
NULL 博文链接:https://song571377.iteye.com/blog/2120192
通过POI可实现根据word模板替换文中或者表格的关键字(包括给定表头动态追加表格)。业务需求我是在模板中直接插入图片(例如衬于文字下方),所有代码中没有插入图片代码。
pdf使用itext实现关键字替换 使用 #<name> 等关键字 替换成任意的字符,单个替换 批量替换
Java读写docx文档时所需jar包完整版,包含所必需的所有jar包,相关代码在博客中有具体描述,可读取并替换文档需要被替换的内容
键字过滤功能自然无比重要,但是如果要在代码中对每个输入进行检查和替换则会是一件非常费神费事的事情。尤其是如果网站已经有了一定规模,用户输入功能已经遍及各处,而急需对所有输入进行关键字过滤时,上述做法更...
替换word关键字相关的jar包
对指定目录下的一篇文本文档实现关键字的替换,或者对图片等其他文件进行替换
有MD5加密,创建数据库连接池、非法关键字替换等等,统统在里面
java实现word表格指定位置盖章,并且设置章悬浮于文字之上,达到跟用实体章在A4纸上盖章一样的效果
主要介绍了Java的this关键字的使用与方法的重载相关知识,是Java入门学习中的基础知识,需要的朋友可以参考下
如ava,java显然不是属于AV这个关键字范围。 使用 KFilter使用起来非常方便,只需要创建Keyword对象即可 1Keyword kw = new Keyword();2kw.Add("av");3kw.Matchs("java"); 在添加关键字后就可以进行匹配操作...
该程序是一个图形界面的java文档编辑器,其界面主要采用了awt包, 程序实现了文本编辑器的基本功能有:新建文件、打开文件、文件保存、文件另存为、剪切、复制、粘贴、删除、查找/替换、改变字体大小,另外还利用Time...
目前已实现:文件的字典映射重命名(可以配合里面的打印字典模板的方式来构造字典),文件全量重命名以及关键字替换重命名。使用方法请大家参考readme文件,请使用markdown工具查看,推荐使用Typora。
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 最...