一种将文本与多个正则表达式模式匹配的快速方法

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 个关键字。通常我会为每个文本进入关键字循环。现在,首先我将所有文本合并为一个大文本。然后 运行 匹配它。将返回匹配的关键字列表。最后,运行 再次匹配每个文本,但只匹配匹配的关键字列表。