首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 關鍵字過濾實作:使用 Regex 進行內容安全檢查

     編輯:關於C語言

前言

在論壇、留言板、即時通訊等使用者生成內容(UGC)的系統中,關鍵字過濾是基本的安全需求。本文示範如何使用 C# 的 System.Text.RegularExpressions.Regex 類別,實作簡單且可擴充的敏感詞偵測機制。

核心實作

using System.Text.RegularExpressions;

public void CheckWords(string input)
{
    // 敏感詞清單,實際專案建議從資料庫或設定檔讀取
    string[] badWords = { "C#", ".NET", "敏感詞1", "敏感詞2" };

    foreach (string word in badWords)
    {
        // 使用 Regex.Escape 處理特殊字元,避免誤判
        string pattern = Regex.Escape(word);
        Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);

        if (regex.IsMatch(input))
        {
            Console.WriteLine($"偵測到敏感詞:{word}");
            // 實際應用:記錄日誌、替換為 ***、攔截發文等
        }
    }
}

使用範例

string test = "學習 C# 和 .NET 開發";
CheckWords(test);
// 輸出:
// 偵測到敏感詞:C#
// 偵測到敏感詞:.NET

進階改進方向

1. 整合資料庫動態載入

// 從資料庫讀取敏感詞
List LoadBadWords()
{
    var list = new List();
    using (var conn = new SqlConnection(connStr))
    using (var cmd = new SqlCommand("SELECT Word FROM SensitiveWords", conn))
    {
        conn.Open();
        using (var reader = cmd.ExecuteReader())
            while (reader.Read()) list.Add(reader.GetString(0));
    }
    return list;
}

2. 敏感詞替換(遮罩)

public string FilterContent(string input)
{
    foreach (string word in badWords)
    {
        string pattern = Regex.Escape(word);
        input = Regex.Replace(input, pattern, 
            m => new string('*', m.Length), 
            RegexOptions.IgnoreCase);
    }
    return input;
}

3. 使用 Trie 樹 / Aho-Corasick 演算法

當敏感詞庫超過數千筆時,逐一 Regex 比對效能不佳。建議改用 Trie 樹 或 Aho-Corasick 多模式比對演算法,單次掃描即可完成所有關鍵字檢測,時間複雜度 O(n + m + z)。

4. 結合機器學習分類

單純關鍵字比對易誤判(如「幹」字在不同語境)。進階方案可結合 NLP 模型(如 FastText、BERT 中文分類器)進行語意層面的內容審核。

注意事項

  • 特殊字元跳脫:敏感詞包含 Regex 元字元(如 . * ?)時,務必使用 Regex.Escape
  • 大小寫不敏感:加上 RegexOptions.IgnoreCase 避免大小寫繞過
  • 全字詞比對:若需精確比對完整單字,可使用 \b 邊界:\\b{0}\\b
  • 效能考量:預先編譯 Regex 物件(RegexOptions.Compiled)或使用靜態 Regex.IsMatch

完整程式碼結構

public class ContentFilter
{
    private readonly List _patterns;

    public ContentFilter(IEnumerable badWords)
    {
        _patterns = badWords
            .Select(w => new Regex(Regex.Escape(w), RegexOptions.IgnoreCase | RegexOptions.Compiled))
            .ToList();
    }

    public bool ContainsBadWord(string input) => 
        _patterns.Any(r => r.IsMatch(input));

    public string Sanitize(string input) => 
        _patterns.Aggregate(input, (s, r) => r.Replace(s, "***"));
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved