ListAとListBの文字列の2つのリストがあります。ListAのすべての文字列に一致し、 ListBのどの文字列にも一致しない正規表現を生成する必要があります。
- 文字列には、文字、数字、句読点の任意の組み合わせを含めることができます。
- 文字列がListAに表示される場合、その文字列がListBに含まれないことが保証されます。
- 文字列がこれら2つのリストのいずれにも含まれていない場合、マッチングの結果がどうなるかは関係ありません。
リストには通常、数千の文字列が含まれており、文字列は互いにかなり似ています。
私はこの質問に対する簡単な答えを知っています。それは、ListAからの文字列(Str1)|(Str2)|(Str3)
であるフォームの正規表現を生成するだけです。StrN
しかし、私はこれを行うためのより効率的な方法を探しています。
理想的な解決策は、2つのリストを取得し、このためのJava正規表現を生成するある種のツールです。
更新1:「効率的」とは、自明な解よりも短い式を生成することを意味します。理想的なアルゴリズムは、短縮された可能な式を生成します。下記は用例です。
ListA = { C10 , C15, C195 }
ListB = { Bob, Billy }
理想的な表現は
/^C1.+$/
別の例として、ListBの3番目の要素に注意してください
ListA = { C10 , C15, C195 }
ListB = { Bob, Billy, C25 }
理想的な表現は
/^C[^2]{1}.+$/
最後の例
ListA = {A、D、E、F、H} ListB = {B、C、G、I}
理想的な表現は、簡単な解決策と同じです。
/^(A|D|E|F|H)$/
また、私は理想的な解決策を探していません。些細なことよりも優れたものが役立つでしょう。私は、些細な解決策のリストを生成するという方針に沿って考えていました。次に、ListBの領域に迷わないように注意しながら、共通のサブストリングをマージしようとしました。
**アップデート2*:正規表現の生成にかかる時間については特に心配していません。最新のマシンでは10分未満であれば問題ありません。