1. 程式人生 > >【過濾敏感詞】正則表示式

【過濾敏感詞】正則表示式

最近做了一個遊戲聊天功能,其中有個過濾敏感字型的需求,其實這個功能很簡單,完全前端去控制,
傳送前把文字過濾一次,後端只轉發就好。

一.重要性

正則表示式在程式設計中經常會用到
如Web前端的合法輸入檢測【郵箱檢測等】
如遊戲聊天中的遮蔽字型等


二.學習
正則表示式規則,掌握一些常用的匹配規則,以下以為C#為例
1.匹配單個字元或單個單詞
例如RegEx = small__Zhang ,則會匹配文字中出現的所有small__zhang


2.匹配單個任意字元"."
例如RegEx = small.,則會匹配諸如small. small1 smallX等


3.如果我們本身只想匹配"."呢,因為"."屬於特殊字元,因為需要加個斜槓轉義
例如Regex = small\.,則只會匹配small.


4.使用[]用以劃定屬於組內的字元的界限
例如RegEx = small[zx],則會匹配smallz或smallx


5.在[]中使用區間,中間用'-'連線
例如RegEx = small__zhang[0-9],則會匹配small__zhang0 ~ small__zhang9的所有字元


6.在[]中使用反義字元,用^開頭
例如RegEx = small__zhang[^0-7],則會匹配除了small_-zhang0 ~ small__zhang7的其他small__zhangX字元


7.如想匹配'['或']'本身,則需要使用斜槓轉義


8.元字元\d和\D
\d與[0-9]相同,\D與[^0-9]相同


9.元字元\w和\W
\w與[a-zA-Z0-9]相同,\W與[^a-zA-Z0-9]相同


10.元字元\s和\S
\s匹配所有單個空字元, \S匹配所有非空字元


11.匹配一個或多個用+
例如RegEx = a+,則匹配一個或多個a


12.郵箱檢測
例如RegEx = [\w.]
[email protected]
[\w.]+\.\w+


13.匹配零個或一個字元用?
例如RegEx = flowers?,則匹配所有的flower或flowers


14.匹配固定資料的字元,用{數字}
例如RegEx = 1[35]\d{9},則匹配13或14開頭的手機號碼


15.匹配區間以內數目的字元,用{最小數字,最大數字}
例如RegEx = \d{1, 3},則匹配1-3位數字


16貪婪匹配和惰性匹配
a.貪婪匹配會盡可能的匹配更多的字元,遇到匹配的不急著將匹配的字元儲存到匹配集合中,而是繼續擴充套件,直到無法繼續匹配為止
b.惰性匹配會極可能的匹配可能少的字元,它從第一個字元開始找起,一旦符合條件,立刻儲存到匹配集合中,然後繼續進行查詢
c.貪婪匹配描述和惰性匹配描述對比:
左邊為貪婪匹配,右邊為惰性匹配
?               ??
++?
**?
{n}{n}?
{n,m}{n,m}?
{n,}{n,}?


17貪婪匹配和惰性匹配對比
匹配文字 small__zhang is a <b> game developer </b> living in <b> GuangZhou </b>.
RegEx = <b>.*</b>,返回<b> game developer </b> living in <b> GuangZhou </b>
RegEx = <b>.*?</b>,返回<b> game developer </b> 與 <b> GuangZhou </b>


18.匹配邊界使用\b
通常情況下以空格,段落首行,段落末尾,逗號,句號和'-'作為邊界
例如RegEx = \bsmall,匹配small開頭的字元
例如RegEx = \bzhang\b,匹配zhang這個字串


19.匹配文字首,使用^
例如RegEx = ^\s*small__zhang,匹配文字的開頭


20.匹配文字末尾,使用$
例如RegEx = small__zhang\s*$


21.子模式,使用"("和")"
例如RegEx = (<br\s*/?>){2,},則匹配諸如<br><br/><br />


22.或匹配,使用"|"
例如RegEx = <i>|<b>,則匹配<i>或<b>


23.子模式中使用或匹配
例如RegEx = (19|20)\d{2},則匹配19XX或20XX


24.巢狀子模式
例如RegEx = (19\d{2}|2000)-([1-9]|1[0-2]),月份可是1到9或者10到12


三.遮蔽關鍵字

public class SenesitiveWord
{
public static readonly Regex reg_word = null;
public static string[] GetDataBaseBlockWords()
{
List<string> dataBaseWords = DataMgr.sensitiveWordModel.GetAllWords();
string rets = dataBaseWords.ToArray();
return rets;
}

public static string GetPattern()
{
StringBuilder patt = new StringBuilder();
string s;
foreach(string word in GetDataBaseBlockWords())
{
if(word.Length == 0)
continue;

patt.AppendFormat("|{0}", word);
}

if(patt.Length > 0)
{
patt.remove(0, 1);
}
return patt.ToString();
}

private static Regex GetRegex()
{
if(reg_word == null)
{
reg_word = new Regex(GetPattern(), RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
}
return reg_word;
}

private bool HasBlockWords(string raw)
{
return GetRegex().Match(raw).Success;
}

private static string WordsFilter(string raw)
{
string ret = GetRegex().Replace(raw, "***");
return ret;
}

public static string ConvertToFilterWords(string raw)
{
string ret = raw;
if(HasBlockWords(raw))
{
ret = WordsFilter(raw);
}
return ret;
}
}


這樣就可以過濾掉敏感詞庫中的字型了

相關推薦

過濾敏感表示式

最近做了一個遊戲聊天功能,其中有個過濾敏感字型的需求,其實這個功能很簡單,完全前端去控制, 傳送前把文字過濾一次,後端只轉發就好。 一.重要性 正則表示式在程式設計中經常會用到 如Web前端的合法輸入檢測【郵箱檢測等】 如遊戲聊天中的遮蔽字型等二.學習 正則表示式規則,掌握

JS學習筆記表示式

1,符號標記組一 ^:位於字串開頭,表示非 $:位於字串結束,正則分組(),$1 var myString1 = "2012,2013,2014"; var theRegExp = /(\d{4})/g; //()分組標記$1 var myStri

Linux學習四表示式

環境  虛擬機器:VMware 10   Linux版本:CentOS-6.5-x86_64   客戶端:Xshell4  FTP:Xftp4 一、grep:顯示匹配行v:反顯示e:使用擴充套件正則表示式E:不使用正則表示式 匹配操作符 \ 轉義字元 . 匹配任意單個字元 [1249a],[^12],[a

選擇器小結表示式、XPath選擇器、CSS選擇器小結和使用場景

$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&

十分鐘學會表示式字元匹配攻略

閱讀建議:看一下正則表示式基礎,有一定的基本概念,效果最佳。 正則表示式是匹配模式,要麼匹配字元,要麼匹配位置。請記住這句話。 然而關於正則如何匹配字元的學習,大部分人都覺得這塊比較雜亂。 畢竟元字元太多了,看起來沒有系統性,不好記。本

Java工具類----表示式校驗工具類

/** * @Title: RegexValidateUtil.java * @Package org.csun.nc.util * @Description: TODO * @author chisj [email protected] * @da

JavaScript小專案表示式實現使用者註冊輸入資訊驗證(包含彈窗和innerHTML驗證)

本博主要是運用正則表示式,登陸介面進行出生日期選擇,用到年月日的三級聯動,第一種驗證方式用到的innerHTML的的動態驗證輸入資訊,第二種驗證方式利用陣列彈窗驗證。效果:圖1.1圖1.2圖1.3圖1.4程式碼:登入頁面的login.html的,主要是年月日三級聯動 <

爬蟲學習1表示式加Requests爬取貓眼電影排行

Requests獲取網頁資料 運用Requests獲得網頁 import requests ##獲取單個網頁資料 def get_one_page(url): response = requests.get(url) r

PHP篇表示式

$rex=”/gg*d/i”表示匹配到g(G)開始d(D)結束且中間只能有G(D)出現任意次,不區分大小寫   1、  定界符號:(1)/ 內容 / (2)|| (3){  } (4)等除字母、數字、“\”以外的字元//必須成對出現   2、  內容裡

速記表格表示式

正則表示式由一些普通字元和一些元字元(metacharacters)組成。普通字元包括大小寫的字母和數字,而元字元則具有特殊的含義,我們下面會給予解釋。 在最簡單的情況下,一個正則表示式看上去就是一個普通的查詢串。例如,正則表示式"testing"中沒有包含任何元字元,它可以匹配"testi

PHP表示式判斷網址是否帶http://或https://

// 匹配http(s)的表示式 $preg = "/^http(s)?:\\/\\/.+/"; 示例: $url = "https://www.baidu.com/"; $preg = "/^http(s)?:\\/\\/.+/"; if(preg_match($preg,$

PHP表示式匹配標籤

// 匹配<img>標籤的表示式 $preg = "/<img.*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png]))[\'|\"].*?[\/]?>/i"; 示例: $img='<div class="div">

PHP表示式匹配最後一張圖片並替換

// 要搜尋的內容 $content = '<div class="div"><img class="img" width="200" height="100" src="./../images/img1.jpg" /> <img class="img" w

表示式–零寬斷言詳解

零寬斷言的意思是(匹配寬度為零,滿足一定的條件/斷言) 我也不知道這個詞語是那個王八蛋發明的,簡直是太拗口了。  零寬斷言用於查詢在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像\b,^,$那樣用於指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它

spider03表示式

什麼是正則表示式 正則表示式是對字串操作的一種邏輯公式,就是用實現定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯。 非Python獨有,re模組實現 常見匹配模式 ^ 匹配字串的開頭 $ 匹配字串

PHP基礎表示式

<?php //功能:將文字中的連結地址轉成HTML //輸入:字串 //輸出:字串 function url2html($text) { //匹配一個URL,直到出現空白為止 preg_match_all("/http:\/\/?[^\s]+/i", $text, $links

程式語言學習——python表示式小作業

參考資料 https://www.cnblogs.com/tina-python/p/5508402.html 原資料 目標 將如上混雜在一列的資料按特徵分隔開。 程式碼 import xlrd import xlwt xlsfile=r'C:\Users\Ad

Python表示式-簡單示例

最近使用Python正則表示式處理資料較多,先將Python使用正則表示式匹配文字的示例程式整理一下。 基本語法 基本語法與變數使用參考一下兩個網站: 示例程式 從檔案中

轉載表示式的數字例項

驗證數字的正則表示式集  驗證數字:^[0-9]*$ 驗證n位的數字:^\d{n}$ 驗證至少n位數字:^\d{n,}$ 驗證m-n位的數字:^\d{m,n}$ 驗證零和非零開頭的數字:^(0|[1-9][0-9]*)$ 驗證有兩位小數的正實數:^[0-9]+

表示式教程表示式入門

很可能你使用過Windows/Dos下用於檔案查詢的萬用字元(wildcard),也就是*和?。如果你想查詢某個目錄下的所有的Word文件的話,你會搜尋*.doc。在這裡,*會被解釋成任意的字串。和萬用字元類似,正則表示式也是用來進行文字匹配的工具,只不過比起萬用字元,它能更精確地描述你的需求——當然,代價就