2

次の ASP.NET C# regexp マッチを最も効率的な方法で実行しているかどうか疑問に思っていました。

入力文字列に一致させる必要がある 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

2つのことが私に飛び出します。1つ目は、次のように、コレクションの作成と同時にコレクションにデータを入力できることです。

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

IsMatch()2つ目は、次のように静的バージョンのを使用する必要があるということです。

  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プロパティの値を増やす必要があります。

于 2012-04-09T05:46:34.583 に答える
1

あなたの目標が単純な「どれかに一致するか? true/false」である場合は、すべての正規表現を 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

私は何も間違っているとは思いません。十分に高速で、ビジネス要件を満たしている限り、効率よりも読みやすさを考慮します。

于 2012-04-09T03:50:36.740 に答える
0

セット内容にもよりますが、どれくらいが本当の数なのかはわかりません。ただし、ケースバイケースで検索基準を考えることができます。考えられる問題をチェックするためにすべてのハッシュ セット コンテンツを実行するのではなく、何をどこで検索するかをプログラムに認識させます。リストビューに表示される 2000 の提供された URL 情報から抽出する単純な正規表現を使用していましたが、プログラム全体のパフォーマンスが大幅に低下しました。

于 2012-04-09T03:36:54.483 に答える