1 åè¨
ææè¯è¿æ»¤å°±æ¯ä½ å¨é¡¹ç®ä¸è¾å ¥æäºåï¼æ¯å¦è¾å ¥xxooç¸å ³çæåæ¶ï¼æ¶è¦è½æ£æµåºæ¥ï¼å¾å¤é¡¹ç®ä¸é½ä¼æä¸ä¸ªææè¯ç®¡ç模åï¼å¨ææè¯ç®¡ç模åä¸ä½ å¯ä»¥å å ¥ææè¯ï¼ç¶åæ ¹æ®å å ¥çææè¯å»è¿æ»¤è¾å ¥å 容ä¸çææè¯å¹¶è¿è¡ç¸åºçå¤çï¼è¦ä¹æ示ï¼è¦ä¹é«äº®æ¾ç¤ºï¼è¦ä¹ç´æ¥æ¿æ¢æå ¶å®çæåæè 符å·ä»£æ¿ã
ææè¯è¿æ»¤çåæ³æå¾å¤ï¼å ¶ä¸ææ¯è¾å¸¸ç¨çå¦ä¸å ç§ï¼
1.æ¥è¯¢æ°æ®åºå½ä¸çææè¯ï¼å¾ªç¯æ¯ä¸ä¸ªææè¯ï¼ç¶åå»è¾å ¥çææ¬ä¸ä»å¤´å°å°¾æç´¢ä¸éï¼çæ¯å¦åå¨æ¤ææè¯ï¼æååç¸åºçå¤çï¼è¿ç§æ¹å¼è®²ç½äºå°±æ¯æ¾å°ä¸ä¸ªå¤çä¸ä¸ªã
ä¼ç¹ï¼so easyãç¨java代ç å®ç°åºæ¬æ²¡ä»ä¹é¾åº¦ã
缺ç¹ï¼è¿æçæ¯é常ä½çï¼å¦ææ¯è±ææ¶ä½ ä¼åç°ä¸ä¸ªå¾æ è¯çäºæ ï¼æ¯å¦è±æaæ¯ææè¯ï¼é£æå¦ææ¯ä¸ç¯è±æææ¡£ï¼é£ç¨åºå®å¾å¤çå¤å°æ¬¡ææè¯ï¼è°è½åè¯æï¼
2.ä¼ è¯´ä¸çDFAç®æ³ï¼æéç¶ææºï¼,ä¹æ£æ¯æè¦ç»å¤§å®¶å享çï¼æ¯ç«æè§æ¯è¾éç¨ï¼ç®æ³çåçå¸æ大家è½å¤èªå·±å»ç½ä¸æ¥æ¥
èµæï¼è¿éå°±ä¸è¯¦ç»è¯´æäºã
ä¼ç¹ï¼è³å°æ¯ä¸é¢é£sbæçé«ç¹ã
缺ç¹ï¼å¯¹äºå¦è¿ç®æ³çåºè¯¥ä¸é¾ï¼å¯¹äºæ²¡å¦è¿ç®æ³çç¨èµ·æ¥ä¹ä¸é¾ï¼å°±æ¯ç解起æ¥æç¹ggç¼ï¼å¹é æçä¹ä¸é«ï¼æ¯è¾èè´¹å åï¼
ææè¯è¶å¤ï¼å åå ç¨çå°±è¶å¤§ã
2 代ç å®ç°
2.1 ææè¯åºåå§å
å¨é¡¹ç®å¯å¨å读åæ°æ®,å°ææè¯å è½½å°Mapä¸,å ·ä½å®ç°å¦ä¸:
建表è¯å¥:
CREATE TABLE `sensitive_word` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主é®',
`content` varchar(50) NOT NULL COMMENT 'å
³é®è¯',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
INSERT INTO `fuying`.`sensitive_word` (`id`, `content`, `create_time`, `update_time`) VALUES (1, 'å´åæ°', '2023-03-02 14:21:36', '2023-03-02 14:21:36');
å®ä½ç±»SensitiveWord.java:
package com.wkf.workrecord.tools.dfa.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author wuKeFan
* @date 2023-03-02 13:48:58
*/
@Data
@TableName("sensitive_word")
public class SensitiveWord implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String content;
private Date createTime;
private Date updateTime;
}
æ°æ®åºæä¹ ç±»SensitiveWordMapper.java:
package com.wkf.workrecord.tools.dfa.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wkf.workrecord.tools.dfa.entity.SensitiveWord;
/**
* @author wuKeFan
* @date 2023-03-02 13:50:16
*/
public interface SensitiveWordMapper extends BaseMapper<SensitiveWord> {
}
serviceç±»SensitiveWordService.javaåSensitiveWordServiceImpl.java:
package com.wkf.workrecord.tools.dfa.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wkf.workrecord.tools.dfa.entity.SensitiveWord;
import java.util.Set;
/**
* ææè¯è¿æ»¤æå¡ç±»
* @author wuKeFan
* @date 2023-03-02 13:47:04
*/
public interface SensitiveWordService extends IService<SensitiveWord> {
Set<String> sensitiveWordFiltering(String text);
}
package com.wkf.workrecord.tools.dfa.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wkf.workrecord.tools.dfa.mapper.SensitiveWordMapper;
import com.wkf.workrecord.tools.dfa.SensitiveWordUtils;
import com.wkf.workrecord.tools.dfa.entity.SensitiveWord;
import org.springframework.stereotype.Service;
import java.util.Set;
/**
* @author wuKeFan
* @date 2023-03-02 13:48:04
*/
@Service
public class SensitiveWordServiceImpl extends ServiceImpl<SensitiveWordMapper, SensitiveWord> implements SensitiveWordService{
@Override
public Set<String> sensitiveWordFiltering(String text) {
// å¾å°ææè¯æåªäºï¼ä¼ å
¥2表示è·åææææè¯
return SensitiveWordUtils.getSensitiveWord(text, 2);
}
}
ææè¯è¿æ»¤å·¥å ·ç±»SensitiveWordUtils:
package com.wkf.workrecord.tools.dfa;
import com.wkf.workrecord.tools.dfa.entity.SensitiveWord;
import lombok.extern.slf4j.Slf4j;
import java.util.*;
/**
* ææè¯è¿æ»¤å·¥å
·ç±»
* @author wuKeFan
* @date 2023-03-02 13:45:19
*/
@Slf4j
@SuppressWarnings("unused")
public class SensitiveWordUtils {
/**
* ææè¯åº
*/
public static final Map<Object, Object> sensitiveWordMap = new HashMap<>();
/**
* åªè¿æ»¤æå°ææè¯
*/
public static int minMatchTYpe = 1;
/**
* è¿æ»¤ææææè¯
*/
public static int maxMatchType = 2;
/**
* åå§åææè¯
*/
public static void initKeyWord(List<SensitiveWord> sensitiveWords) {
try {
// ä»ææè¯éå对象ä¸ååºææè¯å¹¶å°è£
å°Setéåä¸
Set<String> keyWordSet = new HashSet<>();
for (SensitiveWord s : sensitiveWords) {
keyWordSet.add(s.getContent().trim());
}
// å°ææè¯åºå å
¥å°HashMapä¸
addSensitiveWordToHashMap(keyWordSet);
}
catch (Exception e) {
log.error("åå§åææè¯åºé,", e);
}
}
/**
* å°è£
ææè¯åº
*
* @param keyWordSet ææè¯åºå表
*/
private static void addSensitiveWordToHashMap(Set<String> keyWordSet) {
// ææè¯
String key;
// ç¨æ¥æç
§ç¸åºçæ ¼å¼ä¿åææè¯åºæ°æ®
Map<Object, Object> nowMap;
// ç¨æ¥è¾
å©æ建ææè¯åº
Map<Object, Object> newWorMap;
// 使ç¨ä¸ä¸ªè¿ä»£å¨æ¥å¾ªç¯ææè¯éå
for (String s : keyWordSet) {
key = s;
// çäºææè¯åºï¼HashMap对象å¨å
åä¸å ç¨çæ¯åä¸ä¸ªå°åï¼æ以æ¤nowMap对象çååï¼sensitiveWordMap对象ä¹ä¼è·çæ¹å
nowMap = sensitiveWordMap;
for (int i = 0; i < key.length(); i++) {
// æªåææè¯å½ä¸çåï¼å¨ææè¯åºä¸å为HashMap对象çKeyé®å¼
char keyChar = key.charAt(i);
// å¤æè¿ä¸ªåæ¯å¦åå¨äºææè¯åºä¸
Object wordMap = nowMap.get(keyChar);
if (wordMap != null) {
nowMap = (Map<Object, Object>) wordMap;
} else {
newWorMap = new HashMap<>();
newWorMap.put("isEnd", "0");
nowMap.put(keyChar, newWorMap);
nowMap = newWorMap;
}
// å¦æ该åæ¯å½åææè¯çæåä¸ä¸ªåï¼åæ è¯ä¸ºç»å°¾å
if (i == key.length() - 1) {
nowMap.put("isEnd", "1");
}
log.info("å°è£
ææè¯åºè¿ç¨ï¼" + sensitiveWordMap);
}
log.info("æ¥çææè¯åºæ°æ®:" + sensitiveWordMap);
}
}
/**
* ææè¯åºææè¯æ°é
*
* @return è¿åæ°é
*/
public static int getWordSize() {
return SensitiveWordUtils.sensitiveWordMap.size();
}
/**
* æ¯å¦å
å«ææè¯
*
* @param txt ææè¯
* @param matchType å¹é
ç±»å
* @return è¿åç»æ
*/
public static boolean isContainSensitiveWord(String txt, int matchType) {
boolean flag = false;
for (int i = 0; i < txt.length(); i++) {
int matchFlag = checkSensitiveWord(txt, i, matchType);
if (matchFlag > 0) {
flag = true;
}
}
return flag;
}
/**
* è·åææè¯å
容
*
* @param txt ææè¯
* @param matchType å¹é
ç±»å
* @return ææè¯å
容
*/
public static Set<String> getSensitiveWord(String txt, int matchType) {
Set<String> sensitiveWordList = new HashSet<>();
for (int i = 0; i < txt.length(); i++) {
int length = checkSensitiveWord(txt, i, matchType);
if (length > 0) {
// å°æ£æµåºçææè¯ä¿åå°éåä¸
sensitiveWordList.add(txt.substring(i, i + length));
i = i + length - 1;
}
}
return sensitiveWordList;
}
/**
* æ¿æ¢ææè¯
*
* @param txt ææè¯
* @param matchType å¹é
ç±»å
* @param replaceChar 代æ¿è¯
* @return è¿åææè¯
*/
public static String replaceSensitiveWord(String txt, int matchType, String replaceChar) {
String resultTxt = txt;
Set<String> set = getSensitiveWord(txt, matchType);
Iterator<String> iterator = set.iterator();
String word;
String replaceString;
while (iterator.hasNext()) {
word = iterator.next();
replaceString = getReplaceChars(replaceChar, word.length());
resultTxt = resultTxt.replaceAll(word, replaceString);
}
return resultTxt;
}
/**
* æ¿æ¢ææè¯å
容
*
* @param replaceChar éè¦æ¿æ¢çææè¯
* @param length æ¿æ¢é¿åº¦
* @return è¿åç»æ
*/
private static String getReplaceChars(String replaceChar, int length) {
StringBuilder resultReplace = new StringBuilder(replaceChar);
for (int i = 1; i < length; i++) {
resultReplace.append(replaceChar);
}
return resultReplace.toString();
}
/**
* æ£æ¥ææè¯æ°é
*
* @param txt ææè¯
* @param beginIndex å¼å§ä¸æ
* @param matchType å¹é
ç±»å
* @return è¿åæ°é
*/
public static int checkSensitiveWord(String txt, int beginIndex, int matchType) {
boolean flag = false;
// è®°å½ææè¯æ°é
int matchFlag = 0;
char word;
Map<Object, Object> nowMap = SensitiveWordUtils.sensitiveWordMap;
for (int i = beginIndex; i < txt.length(); i++) {
word = txt.charAt(i);
// å¤æ该åæ¯å¦åå¨äºææè¯åºä¸
nowMap = (Map<Object, Object>) nowMap.get(word);
if (nowMap != null) {
matchFlag++;
// å¤ææ¯å¦æ¯ææè¯çç»å°¾åï¼å¦ææ¯ç»å°¾ååå¤ææ¯å¦ç»§ç»æ£æµ
if ("1".equals(nowMap.get("isEnd"))) {
flag = true;
// å¤æè¿æ»¤ç±»åï¼å¦ææ¯å°è¿æ»¤åè·³åºå¾ªç¯ï¼å¦å继ç»å¾ªç¯
if (SensitiveWordUtils.minMatchTYpe == matchType) {
break;
}
}
}
else {
break;
}
}
if (!flag) {
matchFlag = 0;
}
return matchFlag;
}
}
项ç®å¯å¨å®æåæ§è¡åå§åææå ³é®åStartInit.java:
package com.wkf.workrecord.tools.dfa;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wkf.workrecord.tools.dfa.entity.SensitiveWord;
import com.wkf.workrecord.tools.dfa.mapper.SensitiveWordMapper;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
/**
* åå§åææå
³é®å
* @author wuKeFan
* @date 2023-03-02 13:57:45
*/
@Component
public class StartInit {
@Resource
private SensitiveWordMapper sensitiveWordMapper;
@PostConstruct
public void init() {
// ä»æ°æ®åºä¸è·åææè¯å¯¹è±¡éåï¼è°ç¨çæ¹æ³æ¥èªDaoå±ï¼æ¤æ¹æ³æ¯serviceå±çå®ç°ç±»ï¼
List<SensitiveWord> sensitiveWords = sensitiveWordMapper.selectList(new QueryWrapper<>());
// æ建ææè¯åº
SensitiveWordUtils.initKeyWord(sensitiveWords);
}
}
2.2 ç¼åæµè¯ç±»
ç¼åæµè¯èæ¬æµè¯ææ.代ç å¦ä¸:
@Test
public void sensitiveWordTest() {
Set<String> set = sensitiveWordService.sensitiveWordFiltering("å´åæ°å°æ¤ä¸æ¸¸");
for (String string : set) {
System.out.println(string);
}
}
æ§è¡ç»æå¦ä¸:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yN0UWYwcDZ3QmN5YWYjFjYhBjY0cDMjdTZ4UDM0YTO08CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
å´åæ°ä¸ºææè¯,å¹é æå