C#发送消息过滤关键字


TrieFilter类

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

namespace SaaS.Web.Base

{

public class TrieNode

{

public bool m_end;

public Dictionary<Char, TrieNode> m_values;

public TrieNode()

{

m_values = new Dictionary<Char, TrieNode>();

}

}

public class TrieFilter : TrieNode

{

/// <summary>

/// 添加关键字

/// </summary>

/// <param name="key"></param>

public void AddKey(string key)

{

if (string.IsNullOrEmpty(key))

{

return;

}

TrieNode node = this;

for (int i = 0; i < key.Length; i++)

{

char c = key[i];

TrieNode subnode;

if (!node.m_values.TryGetValue(c, out subnode))

{

subnode = new TrieNode();

node.m_values.Add(c, subnode);

}

node = subnode;

}

node.m_end = true;

}

/// <summary>

/// 检查是否包含非法字符

/// </summary>

/// <param name="text">输入文本</param>

/// <returns>找到的第1个非法字符.没有则返回string.Empty</returns>

public bool HasBadWord(string text)

{

for (int i = 0; i < text.Length; i++)

{

TrieNode node;

if (m_values.TryGetValue(text[i], out node))

{

for (int j = i + 1; j < text.Length; j++)

{

if (node.m_values.TryGetValue(text[j], out node))

{

if (node.m_end)

{

return true;

}

}

else

{

break;

}

}

}

}

return false;

}

/// <summary>

/// 检查是否包含非法字符

/// </summary>

/// <param name="text">输入文本</param>

/// <returns>找到的第1个非法字符.没有则返回string.Empty</returns>

public string FindOne(string text)

{

for (int i = 0; i < text.Length; i++)

{

char c = text[i];

TrieNode node;

if (m_values.TryGetValue(c, out node))

{

for (int j = i + 1; j < text.Length; j++)

{

if (node.m_values.TryGetValue(text[j], out node))

{

if (node.m_end)

{

return text.Substring(i, j + 1 - i);

}

}

else

{

break;

}

}

}

}

return string.Empty;

}

//查找所有非法字符

public IEnumerable<string> FindAll(string text)

{

for (int i = 0; i < text.Length; i++)

{

TrieNode node;

if (m_values.TryGetValue(text[i], out node))

{

for (int j = i + 1; j < text.Length; j++)

{

if (node.m_values.TryGetValue(text[j], out node))

{

if (node.m_end)

{

yield return text.Substring(i, (j + 1 - i));

}

}

else

{

break;

}

}

}

}

}

/// <summary>

/// 替换非法字符

/// </summary>

/// <param name="text"></param>

/// <param name="c">用于代替非法字符</param>

/// <returns>替换后的字符串</returns>

public string Replace(string text, char c)

//public string Replace(string text, char c = ‘*‘)

{

char[] chars = null;

for (int i = 0; i < text.Length; i++)

{

TrieNode subnode;

if (m_values.TryGetValue(text[i], out subnode))

{

for (int j = i + 1; j < text.Length; j++)

{

if (subnode.m_values.TryGetValue(text[j], out subnode))

{

if (subnode.m_end)

{

if (chars == null) chars = text.ToArray();

for (int t = i; t <= j; t++)

{

chars[t] = c;

}

i = j;

}

}

else

{

break;

}

}

}

}

return chars == null ? text : new string(chars);

}

}

}

调用执行方法类:

#region 过滤关键字

Stopwatch sw2 = new Stopwatch();

sw2.Start();

int time_cap = 2000;

string urlAddress = HttpContext.Server.MapPath("~/App_Data/KeyWord.txt");

TrieFilter tf = new TrieFilter();

using (StreamReader sw = new StreamReader(System.IO.File.OpenRead(urlAddress)))

{

string key = sw.ReadLine();

while (key != null)

{

if (key != string.Empty)

{

tf.AddKey(key);

}

key = sw.ReadLine();

}

}

if (!string.IsNullOrEmpty(content))

content = tf.Replace(content, ‘*‘);

#region 测试运行时间

//System.Diagnostics.Stopwatch sw1 = new System.Diagnostics.Stopwatch();

//sw1.Start();

//System.Threading.Thread.Sleep(time_cap);

//sw1.Stop();

//TimeSpan ts2 = sw1.Elapsed;

//double t = ts2.TotalMilliseconds;//运行时间

sw2.Stop();

TimeSpan ts3 = sw2.Elapsed;

double times = ts3.TotalMilliseconds;

Console.WriteLine("Stopwatch总共花费{0}ms.", ts3.TotalMilliseconds);

#endregion

#endregion

时间: 2024-11-08 01:43:04

C#发送消息过滤关键字的相关文章

ActiveMQ消息过滤

前言 ActiveMQ提供了一种机制,使用它,消息服务可根据消息选择器中的标准来执行消息过滤.生产者可在消息中放入应用程序特有的属性,而消费者可使用基于这些属性的选择标准来表明对消息是否感兴趣.这就简化了客户端的工作,并避免了向不需要这些消息的消费者传送消息的开销.然而,它也使得处理选择标准的消息服务增加了一些额外开销. 消息选择器是用于MessageConsumer的过滤器,可以用来过滤传入消息的属性和消息头部分(但不过滤消息体),并确定是否将实际消费该消息.消息选择器是一些字符串,它们基于某

Windows消息过滤

在C#编程中,经常会遇到一些场景,如禁止鼠标拖动窗体,启用某些快捷键,禁止鼠标移动等.遇到这些需求,可以通过窗体的MouseMove事件,OnDragDrop,OnMove等事件来解决问题, 但是该方法有个缺点是,只能在当前窗体或控件上起作用,如果窗体或控件被覆盖,就不起作用了.而我们在开发时经常会碰到一个Form上有很多控件的情形,本节将讲述如何通过捕捉windows消息的方式来实现这个功能. 一般来讲,实现该功能有两种方法, 1. 通过重写WndProc(ref Message m)来实现,

Oozie 生成JMS消息并向 JMS Provider发送消息过程分析

一,涉及到的工程 从官网下载源码,mvn 编译成 Eclipse工程文件: 对于JMS消息这一块,主要涉及到两个工程: oozie-core工程有问题的原因是还需要一些其他的依赖工程未导入: 二,Oozie 生成 JMS消息 主要涉及到的一些类 oozie-core 工程中的: oozie-client工程中的: 三,相关代码: 对于Oozie Server而言,它是消息的生产者.在oozie-default.xml/oozie-site.xml里面配置好连接参数,消息服务器....Oozie就

消息过滤

消息过滤的背景 从一个特定的队列或主题接收消息时,您可能会希望由更多的选择.如果没有消息过滤技术,主题订阅者就会接收发布到该主题的每一条消息,而队列接收者也会继续接收下一条消息,并不考虑这些消息的内容或类型. 就主题订阅者来说,它可能要强制处理很多不必要和不想要的消息,这通常导致:编写定制Java代码来人工过滤不想要的消息. 针对队列的消息过滤更有趣,因为它和主题不同:一旦一条消息被一个队列接收者消费以后,对其他所有接收者来说,该队列就不再可用.这意味着,如果一个队列接收者消费了一条消息,并决定

窗口发送消息参数详解

//    窗口.发送消息    函数功能: 将指定的消息发送到一个窗口,同win32 api 里面的SendMessage等同的效果 中文函数原型: 发送消息(hwnd,msg,wparam,iparam)      英文函数原型: sendmessage(hwnd,msg,wparam,iparam) 参数: hwnd: 窗口句柄 值,可以通过,找到窗口.顶层窗口句柄,等获取句柄的函数得到msg:指定被发送的消息wparam:指定附加的消息特定信息. iparam:指定附加的消息特定信息.举

微信通过openID发送消息/后台post、get提交并接收数据 C# .NET 配置404,500等错误信息 连接字符串

控制器:下面是post发送消息(微信不支持从前台发送数据,之前试过,报错,需要跨域,跨域的问题解决后还不行,最后发现之后后端提交 WXApi类: #region 验证Token是否过期 /// <summary> /// 验证Token是否过期 ///</summary> public static bool TokenExpired(string access_token) { string jsonStr = HttpRequestUtil.RequestUrl(string.

JMS学习四(ActiveMQ消息过滤)

消息的过期.消息的选择器和消息的优先级. 一.消息的过期 允许消息过期 .默认情况下,消息永不会过期.如果消息在特定周期内失去意义,那么可以设置过期时间. 有两种方法设置消息的过期时间,时间单位为毫秒: 1.使用消息生产者的setTimeToLive 方法为所有的消息设置过期时间.2.使用消息生产者的send 方法为每一条消息设置过期时间. 消息过期时间,send 方法中的 timeToLive 值加上发送时刻的 GMT 时间值.如果 timeToLive 值等于零,则 JMSExpiratio

消息队列如何利用标签实现消息过滤

场景介绍 一个消息队列(MQ)存储的消息,可以包含不同实际用途.如果这些消息不加区分,消费者每次消费都会按顺序拉取消息,直到完成对所有消息的消费.如果消费者只对某一类型的消息感兴趣,那么将所有消息都消费一遍必会影响消费者处理效率. 解决方案 分布式消息服务DMS是稳定可靠的消息队列服务,提供普通队列.有序队列.Kafka.ActiveMQ.RabbitMQ,兼容HTTP.TCP.AMQP协议,应用于系统解耦.异步通信.流量削峰去谷.第三方集成等场景.DMS提供消息标签的能力,支持生产者为每条消息

第4节 Scala中的actor介绍:1、actor概念介绍;2、actor执行顺序和发送消息的方式

要看这一节... 10.    Scala Actor并发编程 10.1.   课程目标 10.1.1.    目标一:熟悉Scala Actor并发编程 10.1.2.    目标二:为学习Akka做准备 注:Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃. 10.2.   什么是Scala  Actor 10.2.1.    概念 Scala中的Actor能够实