网站首页 > 精选教程 正文
在Java开发中,敏感词过滤是一个常见的需求,特别是在处理用户输入、评论、聊天内容等场景时。你可以使用多种方法来实现敏感词过滤,包括但不限于使用正则表达式、字典树(Trie)、第三方库等。
### 1. 使用正则表达式
正则表达式是一种简单但性能较低的方法,适用于敏感词列表较小的情况。
import java.util.regex.Pattern;
public class SensitiveWordFilter {
private static final Pattern SENSITIVE_WORDS_PATTERN = Pattern.compile("\\b(敏感词1|敏感词2|敏感词3)\\b", Pattern.CASE_INSENSITIVE);
public static String filterSensitiveWords(String input) {
return SENSITIVE_WORDS_PATTERN.matcher(input).replaceAll("***");
}
public static void main(String[] args) {
String input = "这是一个包含敏感词1的句子。";
String filtered = filterSensitiveWords(input);
System.out.println(filtered); // 输出: 这是一个包含***的句子。
}
}
### 2. 使用字典树(Trie)
字典树(Trie)是一种高效的数据结构,适用于敏感词列表较大的情况。
import java.util.HashMap;
import java.util.Map;
public class SensitiveWordFilter {
private TrieNode root = new TrieNode();
public void addSensitiveWord(String word) {
TrieNode node = root;
for (char c : word.toCharArray()) {
node = node.getChildren().computeIfAbsent(c, k -> new TrieNode());
}
node.setEndOfWord(true);
}
public boolean containsSensitiveWord(String text) {
for (int i = 0; i < text.length(); i++) {
if (containsSensitiveWordFrom(text, i)) {
return true;
}
}
return false;
}
public String filterSensitiveWords(String text) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < text.length(); i++) {
int j = i;
while (j < text.length() && containsSensitiveWordFrom(text, j)) {
j++;
}
if (j > i) {
result.append("***");
i = j - 1;
} else {
result.append(text.charAt(i));
}
}
return result.toString();
}
private boolean containsSensitiveWordFrom(String text, int start) {
TrieNode node = root;
for (int i = start; i < text.length(); i++) {
char c = text.charAt(i);
node = node.getChildren().get(c);
if (node == null) {
break;
}
if (node.isEndOfWord()) {
return true;
}
}
return false;
}
private static class TrieNode {
private Map<Character, TrieNode> children = new HashMap<>();
private boolean endOfWord = false;
public Map<Character, TrieNode> getChildren() {
return children;
}
public boolean isEndOfWord() {
return endOfWord;
}
public void setEndOfWord(boolean endOfWord) {
this.endOfWord = endOfWord;
}
}
public static void main(String[] args) {
SensitiveWordFilter filter = new SensitiveWordFilter();
filter.addSensitiveWord("敏感词1");
filter.addSensitiveWord("敏感词2");
String input = "这是一个包含敏感词1的句子。";
String filtered = filter.filterSensitiveWords(input);
System.out.println(filtered); // 输出: 这是一个包含***的句子。
}
}
### 3. 使用第三方库
有一些成熟的第三方库可以帮助你更方便地实现敏感词过滤,例如 `sensitive-word-filter`。
#### 添加依赖
如果你使用 Maven,可以在 `pom.xml` 中添加以下依赖:
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>sensitive-word-filter</artifactId>
<version>1.7.6</version>
</dependency>
#### 使用示例
import com.github.houbb.sensitive.word.api.ISensitiveCheck;
import com.github.houbb.sensitive.word.api.ISensitiveReplace;
import com.github.houbb.sensitive.word.core.check.impl.DefaultSensitiveCheck;
import com.github.houbb.sensitive.word.core.replace.impl.DefaultSensitiveReplace;
public class SensitiveWordFilterExample {
public static void main(String[] args) {
ISensitiveCheck sensitiveCheck = DefaultSensitiveCheck.newInstance();
ISensitiveReplace sensitiveReplace = DefaultSensitiveReplace.newInstance();
// 添加敏感词
sensitiveCheck.addWords("敏感词1", "敏感词2");
String input = "这是一个包含敏感词1的句子。";
boolean containsSensitiveWord = sensitiveCheck.contains(input);
String filtered = sensitiveReplace.replace(input);
System.out.println("是否包含敏感词: " + containsSensitiveWord); // 输出: 是否包含敏感词: true
System.out.println("过滤后的句子: " + filtered); // 输出: 过滤后的句子: 这是一个包含***的句子。
}
}
### 总结
- **正则表达式**:适合敏感词列表较小的情况。
- **字典树(Trie)**:适合敏感词列表较大的情况,性能较好。
- **第三方库**:使用成熟的第三方库可以简化开发工作,提高开发效率。
根据你的具体需求选择合适的方法。
- 上一篇: 北上广深杭30K试题:JVM内存模型如何分配的?
- 下一篇: 学习Lua碰到的问题、踩坑记录
猜你喜欢
- 2024-12-14 Java Web三大组件详解
- 2024-12-14 如何防止短信盗刷和短信轰炸?
- 2024-12-14 拦截器和过滤器的区别!
- 2024-12-14 2019年最不安全密码出炉,赶紧改密码
- 2024-12-14 SpringBoot 前后端加密攻略
- 2024-12-14 如何在Spring Boot中实现数据库配置文件的加密?
- 2024-12-14 Java Web 应用安全防护:从 SQL 注入到 XSS 攻击的防范策略
- 2024-12-14 Java高级特性-泛型:泛型的基本用法,怎样才能少写 1 万行代码
- 2024-12-14 Spring Boot利用filter实现xss防御
- 2024-12-14 Java三大器之拦截器(Interceptor)的实现原理及代码示例
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)