1 に答える
このパターンが交差するかどうかを調べたい (両方に一致する文字列がある)。それを行う方法はありますか?... (...) 特定の 2 つのパターンの文字列セットの交差が空でないかどうかを確認したい。
したがって、これが正しければ、p1 と p2 という 2 つの類似パターンが与えられた場合、p1 と p2 に一致する (まだ決定されていない) 文字列が存在するかどうかに興味があることになります。
例えば:
select check_pattern('a%', 'b_'); -- false
select check_pattern('a%', '_b'); -- true ('ab')
そもそもその問題に対する一般的な解決策があると確信していますか?
「これが私の(有限の)データセットであり、それらを結合/フィルタリングし、それに基づいてセットを生成する」という観点からこれを簡単に表現できないためです。SQL 用語で解決策を見つけるには、データから派生したセットを生成する必要がありますが、問題のセットが無限である場合、それは明らかにオプションではありません。
問題をより小さな部分に分割し、C、Perl、Lisp などの手続き言語を好きなように使用したいと思うでしょう。
考えられる解決策の 1 つとして、次のようなものがあります。
p1 と p2 の両方が両端または異なる端で開いている場合、答えは自明です: 文字列の一致が文字列の一致
%foo%
と交差するのと%bar%
同様に、一致する文字列は一致するものfoo%
と交差します%bar
。p1 が有限セットを生成する (つまり、 no を含まない) 場合、またはループ
%
を使用して p1 の潜在的な一致のセット全体を反復し、各文字列で p2 を試行することを想像できます。それは醜く非効率的ですが、最終的には機能します。generate_series()
for/while/whatever
p1 と p2 が両方とも固定されている場合 (たとえば
abc%
anddef%
または%abc
and%def
)、または合理的に固定されている場合 (たとえば_abc%
andabcd%
)、固定された部分を考慮して前のケースのように処理を進めれば、解決策も自明です。残りのケースがあれば、列挙して解決するのはあなたに任せます...
重要なのは、有限の文字列セットを生成するパターンの固定部分を特定し、一致する (有限の) 文字列セットが交差するかどうかを確認することに固執することだと思います。