静的文字列(特定の正規表現が一致するために一致しなければならない文字列)を効率的に抽出しようとしています。私は最も単純なケースでそれを行うことができましたが、より堅牢なソリューションを見つけようとしています。
以下のような正規表現が与えられます
"fox jump(ed|ing|s)"
私たちに与えるだろう
"fox,jumped,jumping,jumps"
別の例は
"fox jump(ed|ing|s)?"
それは私たちに与えるだろう
"fox,jump"
オプションの演算子のため
私が持っているアルゴリズムは今のところ非常に単純です。正規表現の最後から始まり、グループまたは単一の文字の後にこれらの演算子「*?」が続くものを削除します。また、グループ化されたOR演算子「(|)」を「分解」します。これは非常にうまく機能しましたが、正規表現の完全な構文を考慮していません。これは、正規表現の最小セット生成プロセスの一種と考えることができます(正規表現が「生成/一致する必要がある」文字列の最小セット)。
なぜ? 大量のテキストを大量の正規表現と照合しようとしています。「必須」であるこれらの正規表現の「キーワード」のリストを取得できる場合は、そのキーワードをすばやくテキスト検索して、関心のある正規表現をフィルタリングできます(一致しないことが保証されているものは無視するか、そのテキストをスキップすることもできます)。正規表現のセット内で一致しないことが保証されているため、テキストに対して正規表現を完全に効果的に実行していません)。このキーワードのセットを効率的なデータ構造(Binary Search / Trie / Aho-Corasick)に整理して、有限オートマトンでテキストを実行する前に、一連のregexesをフィルター処理できます。正規表現を実行する前にフィルタリングステージとして実行できる非常に高速な文字列照合アルゴリズムがあります。私'