android 过滤敏感词主要类

package com.example.demo;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

public class SensitiveWordsUtils {

/**

    * 敏感词匹配规则

    */

    public static final int MinMatchTYpe =1;

    public static final int MaxMatchType =2;

    /**

    * 敏感词集合

    */

    public static HashMapsensitiveWordMap;

    /**

    * 初始化敏感词库,构建DFA算法模型

    *

    * @param sensitiveWordSet 敏感词库

    */

    public static synchronized void init(Set sensitiveWordSet) {

initSensitiveWordMap(sensitiveWordSet);

    }

/**

    * 初始化敏感词库,构建DFA算法模型

    *

    * @param sensitiveWordSet 敏感词库

    */

    private static void initSensitiveWordMap(Set sensitiveWordSet) {

//初始化敏感词容器,减少扩容操作

        sensitiveWordMap =new HashMap(sensitiveWordSet.size());

        String key;

        Map nowMap;

        Map newWorMap;

        //迭代sensitiveWordSet

        Iterator iterator = sensitiveWordSet.iterator();

        while (iterator.hasNext()) {

//关键字

            key = iterator.next();

            nowMap =sensitiveWordMap;

            for (int i =0; i < key.length(); i++) {

//转换成char型

                char keyChar = key.charAt(i);

                //库中获取关键字

                Object wordMap = nowMap.get(keyChar);

                //如果存在该key,直接赋值,用于下一个循环获取

                if (wordMap !=null) {

nowMap = (Map) wordMap;

                }else {

//不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个

                    newWorMap =new HashMap<>();

                    //不是最后一个

                    newWorMap.put("isEnd", "0");

                    nowMap.put(keyChar, newWorMap);

                    nowMap = newWorMap;

                }

if (i == key.length() -1) {

//最后一个

                    nowMap.put("isEnd", "1");

                }

}

}

}

/**

    * 判断文字是否包含敏感字符

    *

    * @param txt      文字

    * @param matchType 匹配规则 1:最小匹配规则,2:最大匹配规则

    * @return 若包含返回true,否则返回false

*/

    public static boolean contains(String txt, int matchType) {

boolean flag =false;

        for (int i =0; i < txt.length(); i++) {

int matchFlag =checkSensitiveWord(txt, i, matchType); //判断是否包含敏感字符

            if (matchFlag >0) {//大于0存在,返回true

                flag =true;

            }

}

return flag;

    }

/**

    * 判断文字是否包含敏感字符

    *

    * @param txt 文字

    * @return 若包含返回true,否则返回false

*/

    public static boolean contains(String txt) {

return contains(txt, MaxMatchType);

    }

/**

    * 获取文字中的敏感词

    *

    * @param txt      文字

    * @param matchType 匹配规则 1:最小匹配规则,2:最大匹配规则

    * @return

    */

    public static SetgetSensitiveWord(String txt, int matchType) {

Set sensitiveWordList =new HashSet<>();

        for (int i =0; i < txt.length(); i++) {

//判断是否包含敏感字符

            int length =checkSensitiveWord(txt, i, matchType);

            if (length >0) {//存在,加入list中

                sensitiveWordList.add(txt.substring(i, i + length));

                i = i + length -1;//减1的原因,是因为for会自增

            }

}

return sensitiveWordList;

    }

/**

    * 获取文字中的敏感词

    *

    * @param txt 文字

    * @return

    */

    public static SetgetSensitiveWord(String txt) {

return getSensitiveWord(txt, MaxMatchType);

    }

/**

    * 替换敏感字字符

    *

    * @param txt        文本

    * @param replaceChar 替换的字符,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符:*, 替换结果:我爱***

    * @param matchType  敏感词匹配规则

    * @return

    */

    public static StringreplaceSensitiveWord(String txt, char replaceChar, int matchType) {

String resultTxt = txt;

        //获取所有的敏感词

        Set set =getSensitiveWord(txt, matchType);

        Iterator 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 txt        文本

    * @param replaceChar 替换的字符,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符:*, 替换结果:我爱***

    * @return

    */

    public static StringreplaceSensitiveWord(String txt, char replaceChar) {

return replaceSensitiveWord(txt, replaceChar, MaxMatchType);

    }

/**

    * 替换敏感字字符

    *

    * @param txt        文本

    * @param replaceStr 替换的字符串,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符串:[屏蔽],替换结果:我爱[屏蔽]

    * @param matchType  敏感词匹配规则

    * @return

    */

    public static StringreplaceSensitiveWord(String txt, String replaceStr, int matchType) {

String resultTxt = txt;

        //获取所有的敏感词

        Set set =getSensitiveWord(txt, matchType);

        Iterator iterator = set.iterator();

        String word;

        while (iterator.hasNext()) {

word = iterator.next();

            resultTxt = resultTxt.replaceAll(word, replaceStr);

        }

return resultTxt;

    }

/**

    * 替换敏感字字符

    *

    * @param txt        文本

    * @param replaceStr 替换的字符串,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符串:[屏蔽],替换结果:我爱[屏蔽]

    * @return

    */

    public static StringreplaceSensitiveWord(String txt, String replaceStr) {

return replaceSensitiveWord(txt, replaceStr, MaxMatchType);

    }

/**

    * 获取替换字符串

    *

    * @param replaceChar

    * @param length

    * @return

    */

    private static StringgetReplaceChars(char replaceChar, int length) {

String resultReplace = String.valueOf(replaceChar);

        for (int i =1; i < length; i++) {

resultReplace += replaceChar;

        }

return resultReplace;

    }

/**

    * 检查文字中是否包含敏感字符,检查规则如下:

    *

    * @param txt

    * @param beginIndex

    * @param matchType

    * @return 如果存在,则返回敏感词字符的长度,不存在返回0

*/

    private static int checkSensitiveWord(String txt, int beginIndex, int matchType) {

//敏感词结束标识位:用于敏感词只有1位的情况

        boolean flag =false;

        //匹配标识数默认为0

        int matchFlag =0;

        char word;

        Map nowMap =sensitiveWordMap;

        for (int i = beginIndex; i < txt.length(); i++) {

word = txt.charAt(i);

            //获取指定key

            nowMap = (Map) nowMap.get(word);

            if (nowMap !=null) {//存在,则判断是否为最后一个

                //找到相应key,匹配标识+1

                matchFlag++;

                //如果为最后一个匹配规则,结束循环,返回匹配标识数

                if ("1".equals(nowMap.get("isEnd"))) {

//结束标志位为true

                    flag =true;

                    //最小规则,直接返回,最大规则还需继续查找

                    if (MinMatchTYpe == matchType) {

break;

                    }

}

}else {//不存在,直接返回

                break;

            }

}

if (matchFlag <2 && !flag) {//长度必须大于等于1,为词

            matchFlag =0;

        }

return matchFlag;

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • CloudJavaBackendSummaries1、开发环境eclipse工程,引入jw仓库的jw-base,3...
    燕京博士阅读 928评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,295评论 18 399
  • Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和...
    Java小辰阅读 920评论 0 5
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 1,231评论 0 6
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,401评论 16 21