在論壇、留言板、即時通訊等使用者生成內容(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
// 從資料庫讀取敏感詞
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;
}
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;
}
當敏感詞庫超過數千筆時,逐一 Regex 比對效能不佳。建議改用 Trie 樹 或 Aho-Corasick 多模式比對演算法,單次掃描即可完成所有關鍵字檢測,時間複雜度 O(n + m + z)。
單純關鍵字比對易誤判(如「幹」字在不同語境)。進階方案可結合 NLP 模型(如 FastText、BERT 中文分類器)進行語意層面的內容審核。
. * ?)時,務必使用 Regex.EscapeRegexOptions.IgnoreCase 避免大小寫繞過\b 邊界:\\b{0}\\bRegex 物件(RegexOptions.Compiled)或使用靜態 Regex.IsMatchpublic 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, "***"));
}