0

次の 2 つのケースを考えてみましょう。いずれの場合も、テストする文字列には文字 'a'、't'、'g'、'c' のみが任意の組み合わせで含まれ、任意の長さにすることができます。たとえば、「t」のみを含めることができます。

  • 「a」が 5 回以上出現するかどうかをテストします。文字列の長さが 100 で、文字 'a' が最初の 10 か所に 5 回出現する場合、正規表現は残りの文字列を検索しません。
  • 0 個以上の連続する 'a' が 1 回だけ出現し、文字列が 'a' で終わってはならないかどうかをテストします。有効な例: ggtcccccccctggtaaaatcg、gctgctcgtccttgcttcg、ag。無効: a、agatcttgcgt、agtcga。

これで、両方のケースをテストするための基本的な正規表現を作成する方法がわかりましたが、検索が最適化され、不要な反復が無駄にならないようにしたいと考えています。上記の 2 番目のポイントでは、agatcttgcgt は、3 番目の文字がテストされるとすぐに終了する必要があります。これは、連続規則に違反しているためです。

最適化された正規表現に関するヘルプが役立ちます。また、主要な質問ではありませんが、検索の実行方法 (反復回数など) の内部を確認するにはどうすればよいですか?

4

1 に答える 1

3

パフォーマンスが重要な場合は、正規表現以外のソリューションを検討することをお勧めします。たとえば、最初の要件は を使用して簡単に解決できますstring.Contains

正規表現は通常、入力を左から右に直線的にスキャンし、一致する文字が見つかるまですべての文字を調べ、バックトラッキングがある場合は文字を複数回調べる可能性があります。一方、文字列内のすべての文字を必ずしも検査することなく、部分文字列の有無を判断できる高度な文字列検索アルゴリズムがいくつか存在します。たとえば、 を検索するにaaaaaは、a.

また、主要な質問ではありませんが、検索の実行方法 (反復回数など) の内部を確認するにはどうすればよいですか?

RegexBuddy を使用して、正規表現をデバッグし、必要なステップ数を確認できます。

RegexBuddy: 正規表現のデバッグ

于 2012-08-24T00:14:41.820 に答える