提高多串比较的效率(正则表达式?)

时间:2011-01-23 13:50:20

标签: c# regex string

我有以下代码,我正在努力加快:

private bool IsValidProduct(string productName)
        {
            return (productName.IndexOf("something", StringComparison.InvariantCultureIgnoreCase) == -1 &&
                    productName.IndexOf("whatever", StringComparison.InvariantCultureIgnoreCase) == -1 &&
                    productName.IndexOf("blah", StringComparison.InvariantCultureIgnoreCase) == -1 &&
                    productName.IndexOf("keyword", StringComparison.InvariantCultureIgnoreCase) == -1 &&
                    productName.IndexOf("etc...", StringComparison.InvariantCultureIgnoreCase) == -1);
        }

我目前正在检查大约十几个单词。

这样做的最快方法是什么?

4 个答案:

答案 0 :(得分:5)

正则表达式不是一个好主意,尝试这样的事情:

List<string> keywords = new List<string>
    {
        "something",
        "whatever",
        "keyword",
        "etc"
    };

return keywords.All(keyword => !productName.Contains(keyword));

答案 1 :(得分:2)

您可以将productName转换为小写,然后使用.Contains。应该快一点。由于你使用的是不变的文化,这应该有用(有些文化没有)。

string lowerProductName=productName.ToLowerInvariant();
return !(lowerProductName.Contains("1")||
         lowerProductName.Contains("2"));

有一些技术可以让它更快,但你不太可能需要它们。而且它们实施起来更复杂。特别是因为你只有一些简短的关键词。

但是我同意Cody的说法,你应该首先介绍一下,看看这个代码是否真的让你失望。

答案 2 :(得分:2)

  

我目前正在检查大约十几个单词。

我认为这意味着您确实没有性能问题。

但正则表达式解决方案看起来像:

var r = new Regex("something|whatever|blah", RegexOptions.IgnoreCase);
return ! r.ismatch(productName);

在我看来,这至少是可读的。而且我相信它会更快,但你必须要分析。

为了提高性能,您必须缓存&amp;重用RegEx实例。创建它是一个昂贵的部分。

答案 3 :(得分:0)

如何使用Rabin-Karp的实现来搜索目标文本中的一组关键字?

Boyer-Moore哪个是快速字符串搜索的黄金标准,但一次只能搜索一个字符串?