日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C#過濾敏感詞DFA算法

 印度阿三17 2019-09-08

今天游戲正好用到需要過濾敏感詞將出現(xiàn)的敏感詞替換成*,在網(wǎng)上找了許久找了一片可用的java版本的DFA算法,最后費了一番功夫?qū)⑵渌悸酚肅#實現(xiàn),里面的注釋甚至都沒改動的,這里直接上代碼,這里不借助任何第三方工具,復(fù)制粘貼就是用

當(dāng)然想看原博客的點擊這里


using UnityEngine;
using System.Collections.Generic;
public class Test : MonoBehaviour
{
    public TextAsset txt;
    private void Start()
    {
        
    }
    private void Update()
    {
        if (Input.GetKeyDown("x")) {
            string str = "后來的啊微信哈哈嘀嘀嘀微信qqwx呼呼呵呵";
            HashSet<string> set = ReadTxtByLine(txt);
            Dictionary<object, object> map = AddBadWordToHashMap(set);
            string set1 = GetBadWord(str, 2, map);
            print(set1);
        }
    }
    private HashSet<string> ReadTxtByLine(TextAsset file) {
        //使用換行和回車符分割敏感詞
        string[] str = file.text.Split('\n','\r');
        HashSet<string> setTemp = new HashSet<string>();
        if (str != null) {
            foreach (string s in str)
            {
                setTemp.Add(s);
            }
        }
        return setTemp;
    }
    private Dictionary<object, object> AddBadWordToHashMap(HashSet<string> keyWordSet)
    {
        //初始化敏感詞容器,減少擴容操作
        Dictionary<object, object> wordMap = new Dictionary<object, object>(keyWordSet.Count);
        string key = null;
        Dictionary<object,object> nowMap = null;
        Dictionary<object, object> newWorMap = null;
        //迭代keyWordSet
        foreach (var v in keyWordSet) {
            key = v;
            nowMap = wordMap;
            char[] keyChars = key.ToCharArray();
            for (int i = 0; i < keyChars.Length; i  ) {
                //轉(zhuǎn)換成char型
                char keyChar = keyChars[i];
                //如果存在該key,直接賦值
                if (nowMap.ContainsKey(keyChar.ToString())) {
                    nowMap = wordMap;
                }else{
                    //不存在則,則構(gòu)建一個map,同時將isEnd設(shè)置為0,因為他不是最后一個
                    newWorMap = new Dictionary<object, object>();
                    //不是最后一個
                    newWorMap.Add("isEnd", "0");
                    nowMap.Add(keyChar.ToString(), newWorMap);
                    nowMap = newWorMap;
                }
                if (i == keyChars.Length - 1){
                    //最后一個
                    if (nowMap.ContainsKey("isEnd")) {
                        nowMap.Remove("isEnd");
                    }
                    nowMap.Add("isEnd", "1");
                }
            }
        }
        return wordMap;
    }
    public string GetBadWord(string txt, int matchType, Dictionary<object, object> wordMap)
    {
        char[] c = txt.ToCharArray();
        for (int i = 0; i < txt.Length; i  )
        {
            //判斷是否包含敏感字符
            int length = CheckBadWord(txt, i, matchType, wordMap);
            if (length > 0)
            {
                string oldStr = txt.Substring(i, length);
                //替換敏感詞
                for (int j = 0; j < length; j  ) {
                    c[j   i] = '*';
                }
                //減1的原因,是因為for會自增
                i = i   length - 1;
            }
        }
        return new string(c);
    }
    private int CheckBadWord(string txt, int beginIndex, int matchType, Dictionary<object, object> wordMap)
    {
        //敏感詞結(jié)束標(biāo)識位:用于敏感詞只有1位的情況
        bool flag = false;
        //匹配標(biāo)識數(shù)默認(rèn)為0
        int matchFlag = 0;
        char word = '0';
        object nowMap = wordMap;
        char[] words = txt.ToCharArray();
        for (int i = beginIndex; i < words.Length; i  )
        {
            word = words[i];
            //獲取指定key
            if (((Dictionary<object, object>)nowMap).ContainsKey(word.ToString())) {
                //存在,則判斷是否為最后一個
                //找到相應(yīng)key,匹配標(biāo)識 1
                nowMap = ((Dictionary<object, object>)nowMap)[word.ToString()];
                matchFlag  ;
                if (((Dictionary<object, object>)nowMap).ContainsKey("isEnd")) {
                    string temp = (string)((Dictionary<object, object>)nowMap)["isEnd"];
                    if ("1".Equals(temp))
                    {
                        //如果為最后一個匹配規(guī)則,結(jié)束循環(huán),返回匹配標(biāo)識數(shù)
                        //結(jié)束標(biāo)志位為true
                        flag = true;
                        if (1 == matchType)
                        {
                            //最小規(guī)則,直接返回,最大規(guī)則還需繼續(xù)查找
                            break;
                        }
                    }
                }
            }
            else
            {     //不存在,直接返回
                break;
            }
        }
      
        if (!flag)
        {
            matchFlag = 0;
        }
        return matchFlag;
    }
 
}

下面是是敏感詞庫,其實就是一個.txt文件大家自己創(chuàng)建就行我這內(nèi)容也不多上個截圖就好

好了今天就這么多

來源:https://www./content-1-443701.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多