一种将文本与多个正则表达式模式匹配的快速方法
A speedy way to match a text to multiple regex pattern
我有大约 50000 个关键字应用了正则表达式模式。我的应用程序获取一些文本内容并尝试查找与此内容匹配的关键字。
我这样做是为了遍历所有关键字并在内容中搜索每个关键字。
因为匹配的内容太多我愿意找到更好的方法。
有没有更好的方法呢?
这是我目前正在做的示例代码:
List<string> keywords = getKeywords();
string textToMatch = getNews();
List<string> result = new List<string>();
foreach (var keyword in keywords)
{
Match r = Regex.Match(textToMatch, keyword);
if(r.Success)
result.Add(keyword)
}
首先你可以使用RegexOptions.Compiled
它指示正则表达式引擎使用轻量级代码生成将正则表达式编译成IL。程序启动速度较慢,但使用正则表达式的匹配速度更快。
下一步将是消费者生产者设计模式的一些很好的实现。遗憾的是,我不知道您的操作中最慢的是什么,但如果您尝试实施此模式,它应该会更快(下面的一些伪代码)
BlockingCollection<string> collection = new BlockingCollection<string>();
Action productionAction = () =>
{
//produce data then
collection.Add(ProcessedData);
};
Action consumentAction = () =>
{
//consume data
var data = collection.Take();
//then
//do your things
};
Parallel.Invoke(productionAction,consumentAction);
// code will end here when everything will be processed
// also you can change Action to TaskRun to use some Multithreading
您也可以尝试通过用 Parallel.ForEach
替换循环来显着提高性能(或不能!我不了解您的其余代码!)的最简单方法
如果我们认为只有一个文本可以匹配多个关键字,那么就没有完全不同的处理方法。我们可以只使用 Parallel.For
、编译的正则表达式等
就我而言,我收到了太多与关键字不匹配的短信。假设我有 50 个文本和 50000 个关键字。通常我会为每个文本进入关键字循环。现在,首先我将所有文本合并为一个大文本。然后 运行 匹配它。将返回匹配的关键字列表。最后,运行 再次匹配每个文本,但只匹配匹配的关键字列表。
我有大约 50000 个关键字应用了正则表达式模式。我的应用程序获取一些文本内容并尝试查找与此内容匹配的关键字。
我这样做是为了遍历所有关键字并在内容中搜索每个关键字。
因为匹配的内容太多我愿意找到更好的方法。
有没有更好的方法呢?
这是我目前正在做的示例代码:
List<string> keywords = getKeywords();
string textToMatch = getNews();
List<string> result = new List<string>();
foreach (var keyword in keywords)
{
Match r = Regex.Match(textToMatch, keyword);
if(r.Success)
result.Add(keyword)
}
首先你可以使用RegexOptions.Compiled
它指示正则表达式引擎使用轻量级代码生成将正则表达式编译成IL。程序启动速度较慢,但使用正则表达式的匹配速度更快。
下一步将是消费者生产者设计模式的一些很好的实现。遗憾的是,我不知道您的操作中最慢的是什么,但如果您尝试实施此模式,它应该会更快(下面的一些伪代码)
BlockingCollection<string> collection = new BlockingCollection<string>();
Action productionAction = () =>
{
//produce data then
collection.Add(ProcessedData);
};
Action consumentAction = () =>
{
//consume data
var data = collection.Take();
//then
//do your things
};
Parallel.Invoke(productionAction,consumentAction);
// code will end here when everything will be processed
// also you can change Action to TaskRun to use some Multithreading
您也可以尝试通过用 Parallel.ForEach
替换循环来显着提高性能(或不能!我不了解您的其余代码!)的最简单方法如果我们认为只有一个文本可以匹配多个关键字,那么就没有完全不同的处理方法。我们可以只使用 Parallel.For
、编译的正则表达式等
就我而言,我收到了太多与关键字不匹配的短信。假设我有 50 个文本和 50000 个关键字。通常我会为每个文本进入关键字循环。现在,首先我将所有文本合并为一个大文本。然后 运行 匹配它。将返回匹配的关键字列表。最后,运行 再次匹配每个文本,但只匹配匹配的关键字列表。