什么可以改善以下正则表达式的性能改进?

时间:2017-08-25 21:48:16

标签: c# regex string

我有列表和文本文件,我想:

  1. 查找同样在字符串中的所有列表项(匹配的单词)和 将它们存储在列表或数组中

  2. 将所有找到的匹配单词替换为“姓名”

  3. 计算匹配的单词

  4. 代码工作正常,但执行大约需要10分钟我想提高代码的性能,我也尝试使用包含函数而不是正则表达式,但它对代码的工作有影响因为我试图匹配完整的单词而不是子字符串。

    以下是代码:

    Public Property Let lngMarketID

    是否有另一种方法可以执行与上述代码相同的操作,并提高性能?

2 个答案:

答案 0 :(得分:0)

如果Names确实包含“数百万”字符串,那么您正在构建一个包含“数百万”字符串的正则表达式。这将表现得非常糟糕,甚至只是为了解析正则表达式,更不用说评估它了。

您应该做的是将您的姓名加载到HashSet<string>,然后解析文档一次,拉出整个单词。您可以使用正则表达式或编写状态机来执行此操作。对于您阅读的每个“单词”,检查它是否存在于HashSet<string>个名称中,如果存在,请将“名称”写入您的输出(StringBuilder将是理想的选择)。如果单词不在Names hashset中,请将实际单词写入输出。在遇到输出时,请务必将任何非单词字符写入输出。完成后,输出将包含已清理的结果,它应该完成毫秒而不是几分钟。

答案 1 :(得分:0)

如果我理解你真正想要的东西;我想你可以用这个代码代替:
如果您可以忽略生成的匹配单词计数

text = names.Select(name => $@"\b{name}\b")
            .Aggregate(text, (current, pattern) => Regex.Replace(current, pattern, "Names"));

否则:

var count = 0;
var matchedWord = new List<string>();
foreach (var name in names)
{
    var regex = new Regex($@"\b{name}\b");
    if (regex.IsMatch(text))
    {
        count++;
        matchedWord.Add(name);
    }

    text = regex.Replace(text, "Names");
}