C#敏感词过滤实现方法攻略
敏感词过滤在许多场景下都是必须的,比如社交平台的评论、发送短信等。在C#中,实现敏感词过滤的方法主要有以下两种:
方法一:正则表达式过滤
正则表达式是一种实现模式匹配的语言,我们可以利用正则表达式的特性来实现敏感词过滤。下面是使用正则表达式实现敏感词过滤的代码示例:
using System.Text.RegularExpressions;
...
// 传入敏感词数组,返回替换后的字符串
public string FilterSensitiveWords(string[] sensitiveWords, string text)
{
string pattern = "(" + string.Join("|", sensitiveWords) + ")";
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
return regex.Replace(text, "***");
}
这段代码使用了System.Text.RegularExpressions
命名空间中的Regex
类和相关方法,将传入的敏感词通过"|"
连接起来组成一个正则表达式的模式,然后将字符串中匹配到的敏感词替换为"***"。
方法二:Trie树过滤
Trie树又叫字典树或前缀树,它是一种字符串查找的树型数据结构,可以利用Trie树来实现快速匹配。
下面是使用Trie树实现敏感词过滤的代码示例:
using System.Collections.Generic;
...
public class TrieNode
{
public char Val;
public bool IsEnd;
public Dictionary<char, TrieNode> Children;
public TrieNode(char val)
{
Val = val;
IsEnd = false;
Children = new Dictionary<char, TrieNode>();
}
}
public class Trie
{
private TrieNode root;
public Trie()
{
root = new TrieNode('^');
}
// 插入单词
public void Insert(string word)
{
var curr = root;
foreach (var c in word)
{
if (!curr.Children.ContainsKey(c))
curr.Children.Add(c, new TrieNode(c));
curr = curr.Children[c];
}
curr.IsEnd = true;
}
// 查找是否包含敏感词
public bool Contains(string text)
{
var curr = root;
for (int i = 0; i < text.Length; i++)
{
var c = text[i];
if (curr.Children.TryGetValue(c, out var next))
{
curr = next;
if (curr.IsEnd)
return true;
}
else
curr = root;
}
return false;
}
}
// 使用Trie树过滤敏感词
public string FilterSensitiveWords(string[] sensitiveWords, string text)
{
var trie = new Trie();
foreach (var word in sensitiveWords)
{
trie.Insert(word);
}
var result = new StringBuilder();
int i = 0, j = 0;
while (j < text.Length)
{
if (trie.Contains(text[j..]))
{
result.Append(text[i..j]);
result.Append("***");
i = ++j;
}
else
j++;
}
result.Append(text[i..]);
return result.ToString();
}
这段代码中,我们首先定义了一个TrieNode
类和一个Trie
类,其中TrieNode
表示Trie树节点的结构体,Trie
类则表示Trie树本身。
通过循环遍历敏感词数组,将每个敏感词插入到Trie树中。对于要过滤的文本,我们使用两个指针i
和j
来分别指向文本的起始和终止位置,然后不断移动j
指针,检查从j
开始的子串是否在Trie树中,如果在Trie树中,则将当前结果保存下来,并将i
指针移到j
所在位置的下一位,然后继续从j
位置开始向后查找。如果不在Trie树中,则只移动j
指针。
最终将i
和j
之间的内容和j
之后的内容拼接成最终的结果字符串。
示例说明
示例一:正则表达式过滤
假设我们要过滤的文本为"我是一名哈麻拼车司机,我喜欢打哈麻。"
,我们定义一个敏感词数组为["哈麻", "打哈麻"]
,然后调用过滤函数:
FilterSensitiveWords(new string[]{"哈麻", "打哈麻"}, "我是一名哈麻拼车司机,我喜欢打哈麻。");
则返回的结果为:
我是一名***拼车司机,我喜欢***。
示例二:Trie树过滤
假设我们要过滤的文本为"你搞甚么兔子啊!"
,我们定义一个敏感词数组为["兔子", "甚么"]
,然后调用过滤函数:
FilterSensitiveWords(new string[]{"兔子", "甚么"}, "你搞甚么兔子啊!");
则返回的结果为:
你搞***啊!
这里只过滤了"甚么"和"兔子"两个词,因此,"啊"没有被过滤掉。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#敏感词过滤实现方法 - Python技术站