私は数日で誰もそれを打つことができない限り、答えとして自分の答えを記しません。
これまでのところ私が価値があった唯一のアイデアは、正規表現を追加するときに正規表現をコンテナ内の2つのファイルのいずれかに入れることです。
1つのパイルには、ワイルドカード、文字クラス、または従来の文字列から逸脱するものを含むすべての正規表現があります。私はこれをRegexPileと呼びます。
他のファイルには、文字列であるか、または文字列に変換可能なすべての正規表現が入ります。文字列が一致しやすく、アルゴリズムがよく理解されているので、このパイルが配列され、並べ替えられ、並べ替えられ、バイナリ検索で文字列を見つけることは簡単です。私はこれをSortedStringArrayと呼びます。
単純に、私は直線的にRegexPileを検索し、SortedStringArrayのバイナリ検索を行うことができます。これは、少なくとも私が時間や空間の点ではほとんど比較やコストをスキップすることができますが、あまり実際の最適化もしません。
これは計算上似ていますが、このようなことをすれば、各正規表現(または小さな正規表現グループ)ごとにスレッドを起動すると思います。RegexPile私の考えは正規表現がそれを行うことができるので、任意の正規表現は無限の量を取ることができるということです。その後、スレッドが長すぎる場合は、タイムアウトに基づいて失敗し、すべてのスレッドを早期に終了できます。最初の文字がチェックされると、ほとんどのスレッドが消えてしまうということを意味する最初の文字で大半が失敗すると私は考えています。安価なコピーオンライトスレッドでは、ほとんどのシステムが今日提供していますが、このスレッド生成は十分に安価でなければならず、多くのスレッドが終了する前に閉じる必要があり、かなり類似しているスレッドのみがいつでも残っています。次に、別のスレッドでSortedStringArrayのバイナリを行います。
これらを1つの表現に結合し、必要に応じて元の表現を「取り込む」。 – greybeard
これらの(数学的に言えば)正規表現ですか、それとも、正規表現ライブラリのように、チューリング完全一致関数のsimeランダムセットですか?そしてそれらは完全一致か部分文字列一致ですか? – rici
@rici PCRE/ECMAScript正規表現と完全一致。しかし、私はすべてのバリエーションの答えが不思議です。 – Sqeaky