2

我想知道我是否以最有效的方式进行以下 ASP.NET C# 正则表达式匹配?

我在 HashSet 中有一组正则表达式,需要与输入字符串匹配,所以我这样做:

HashSet<string> hashMatchTo = new HashSet<string>();
hashMatchTo.Add(@"regexp 1");
hashMatchTo.Add(@"regexp 2");
hashMatchTo.Add(@"regexp 3");
hashMatchTo.Add(@"regexp 4");
hashMatchTo.Add(@"regexp 5");
//and so on

string strInputString = "Some string";

bool bMatched = false;
foreach (string strRegExp in hashMatchTo)
{
    Regex rx = new Regex(strRegExp, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
    if (rx.IsMatch(strInputString))
    {
        bMatched = true;
        break;
    }
}
4

4 回答 4

1

有两件事突然出现在我身上。第一个是您可以在创建集合的同时填充集合,如下所示:

  HashSet<string> hashMatchTo = new HashSet<string>()
  {
      @"^regexp 1$", 
      @"^regexp 2$",
      @"^regexp 3$",
      @"^[\w\s]+$",
      @"^regexp 5$"
      //and so on
  };

第二个是您应该使用静态版本IsMatch(),如下所示:

  string strInputString = "Some string";

  bool bMatched = false;
  foreach (string strRegExp in hashMatchTo)
  {
      if (Regex.IsMatch(strInputString,  strRegExp, 
            RegexOptions.CultureInvariant | RegexOptions.IgnoreCase))
      {
          bMatched = true;
          break;
      }
  }
  Console.WriteLine(bMatched);
}

这样做的原因是静态 Regex 方法会自动缓存它们创建的任何 Regex 对象。但请注意,默认情况下缓存大小仅为 15;如果你认为你会使用更多,你需要增加CacheSize属性的值。

于 2012-04-09T05:46:34.583 回答
1

如果您的目标是一个简单的“是否匹配任何?真/假”,那么将所有正则表达式连接成一个大正则表达式并运行它。

string strRegexp = string.Join("|", listOfRegex.ToArray());

bool bIsMatched = Regex.IsMatch(strInputString, strRegExp, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);

Console.WriteLine(bMatched);
  • 没有“foreach”循环
  • 更好的可读性
  • 无需弄乱静态正则表达式缓存
  • 在处理时,它会像在循环版本中使用“break”一样短路,但会进行更少的方法调用,这(应该)提高性能。
于 2012-04-09T11:48:23.707 回答
0

这取决于你设置的内容,我不知道有多少是真的很多。但是您可能会考虑根据具体情况搜索标准。让您的程序知道要搜索的内容和位置,而不是遍历所有哈希集内容以检查可能的问题。我曾经使用一个简单的正则表达式从 2000 提供的 url 中提取要显示在列表视图中的信息,但它严重降低了整个程序的性能。

于 2012-04-09T03:36:54.483 回答
0

我看不出有什么不对。只要它足够快并且满足业务需求,我会考虑可读性而不是效率。

于 2012-04-09T03:50:36.740 回答