使用 C# 将 HashSet 中的一组正则表达式与 ASP.NET 中的字符串匹配的最佳方法是什么?

本文关键字:字符 字符串 NET ASP 串匹配 最佳 是什么 方法 一组 HashSet 使用 | 更新日期: 2023-09-27 18:30:23

我想知道我是否以最有效的方式进行以下 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;
    }
}

使用 C# 将 HashSet 中的一组正则表达式与 ASP.NET 中的字符串匹配的最佳方法是什么?

有两件事突然出现在我面前。 首先,您可以在创建集合的同时填充集合,如下所示:

  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);
}

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

如果你的目标是一个简单的"匹配任何?真/假",然后将所有正则表达式连接成一个大正则表达式并运行它。

string strRegexp = string.Join("|", listOfRegex.ToArray());
bool bIsMatched = Regex.IsMatch(strInputString, strRegExp, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
Console.WriteLine(bMatched);
  • 没有"foreach"循环
  • 更好的可读性
  • 无需弄乱静态正则表达式缓存
  • 处理时,它会短路,就像在循环版本中使用"break"一样,但将进行更少的方法调用,这(应该)提高性能。

我没有看到任何错误。我会考虑可读性而不是效率,只要它足够快并满足业务需求。

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