`
jsczxy2
  • 浏览: 1273590 次
  • 性别: 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你妈呀唉呀呀呀唉呀呀呀唉呀呀妈呀唉呀妈呀呀呀呀唉呀呀呀唉呀呀"));
	}
}

 

分享到:
评论

相关推荐

    java实现根据关键字查找所在文件夹的文件

    在Java编程语言中,实现根据关键字查找文件夹内包含该关键字的文件是一项常见的任务,尤其在数据处理、日志分析或者文件管理系统中。这个功能可以帮助用户快速定位到含有特定信息的文件,提高工作效率。以下是一个...

    java PDF关键字定位

    在Java开发中,处理PDF文档是一项常见的任务,特别是在需要搜索、提取或替换PDF中的特定信息时。本篇文章将深入探讨如何使用iText库在Java中实现PDF关键字定位。iText是一个强大的PDF处理库,它提供了丰富的API来...

    高效关键字过滤java源码

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

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

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

    文本关键字批量替换

    此外,对于一些特定格式的文本文件,如CSV、JSON或XML,可能需要解析其结构后再进行关键字替换,以确保不破坏文件的原始结构。同时,为了保证替换操作的准确性,通常会提供预览功能,让用户在执行替换前确认修改内容...

    POI替换word模板中的关键字

    Apache POI是一个强大的Java库,专门用于处理...以上就是使用Apache POI在Java中替换Word模板关键字和动态追加表格的知识点。通过熟练掌握这些技术,你可以构建出强大的文档自动化处理工具,满足各种业务需求。

    java poi 替换word文本

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

    用java替换txt里的文字

    在Java编程中,替换文本文件中的特定文字是一项常见的任务,特别是在处理日志、配置文件或者进行文本处理的应用中。本文将详细讲解如何使用Java来实现这个功能,同时也会涉及到一些基本的文件操作和字符串处理技术。...

    关键字过滤

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

    java入门记事本关键字变色

    正则表达式允许我们定义模式,用于查找和替换特定的文本序列,这在高亮显示关键字时非常有用。 4. **颜色处理**:Java提供了`Color`类来处理颜色,我们可以创建不同颜色的对象,然后将其应用于文本组件的字体颜色,...

    java 统计指定文件中的字符个数

    // 替换为实际文件路径 int count = 0; try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { String line; while ((line = reader.readLine()) != null) { count += line.length...

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

    Java是一种广泛使用的编程语言,尤其在企业级应用开发中占据主导地位。在处理文档方面,Java提供了多种库来操作不同的文件格式,如Microsoft Office的docx文档。在本主题中,我们将聚焦于如何使用Java来读取和写入...

    WEB项目中实现屏蔽关键字代码

    4. **处理匹配结果**:如果检测到用户输入中包含黑名单关键字,你可以选择替换这些关键字为星号或其他提示文字,或者直接阻止该内容的发布。在JSP页面上,你可以使用EL(Expression Language)或JSTL(JavaServer ...

    java swing里支持,js,java编程语言,关键字高亮显示

    对于Java和JavaScript,你可以创建一个包含所有关键字的列表,然后用正则表达式进行匹配和替换。 5. **文本组件**:在Swing中,`JTextComponent`(如`JTextArea`或`JEditorPane`)是用于显示和编辑文本的基础类。要...

    java关键字final使用方法详解

    Java中的`final`关键字是一种非常重要的修饰符,它用于声明变量、方法或类,以确保它们的不可变性。在深入探讨`final`的使用方法之前,我们需要理解为什么在编程中会需要不可变性。 不可变性在软件设计中起着至关...

    POI word替换关键字,转PDF

    综上所述,"POI word替换关键字,转PDF"涉及到Java中使用Apache POI进行文本操作以及将Word转换为PDF的技巧。通过理解这些技术,开发者可以有效地实现对Word文档的自动化处理,满足特定的业务需求。

    替换word关键字相关的jar包

    在Java编程环境中,替换Word关键字是一项常见的任务,特别是在文档处理或自动化工作中。为了实现这个功能,开发者通常会依赖于特定的库或者API,而jar包就是这些库或API的打包形式。"替换word关键字相关的jar包"这个...

    Encryption:使用关键字加密和解密文本的Java代码

    在这个“Encryption:使用关键字加密和解密文本的Java代码”项目中,我们将探讨如何在Java中实现基于关键字的简单加密和解密方法。 首先,我们需要理解加密的基本概念。加密是将明文(可读数据)转换为密文(不可读...

    Matlab在求候选关键字的替换算法中的应用.pdf

    需要注意的是,虽然MATLAB在关系模式和候选关键字求解算法的实现中显示了明显的优势,但在某些情况下,特别是涉及字符串处理和模式匹配任务时,MATLAB可能不如一些专门设计用于字符串处理的编程语言(如C++或Java)...

    基于Java实现正则表达式提取关键字并插入数据库

    在本项目中,我们主要探讨如何使用Java编程语言来实现正则表达式的关键字提取,并将这些关键字存储到MySQL数据库中。这是一个常见的任务,尤其是在数据分析、日志处理或信息提取等场景下。以下是对这个过程的详细...

Global site tag (gtag.js) - Google Analytics