1

次のような検索クエリを変換しようとしています。

bridge AND (car OR boat)

これに対して一致する正規表現に:

My car goes over bridge.

私はそれを手に入れようとしています(私は思う)、これは私がこれまでに持っているものです:

.*(bridge).*(car|boat)

それはうまくいきませんが、これはうまくいきます:

.*(car|boat).*(bridge)

私の正規表現は、文字列内の単語の順序に依存しているようです。パラメータの順序を気にせずにパラメータを一致させる方法はありますか?

4

2 に答える 2

2

簡単な答え: いいえ、単一の正規表現ではありません。正規表現は、順序付けられた文字列を照合するためのものです。

もちろん、両方の順序付けを明示的に許可するパターンを生成できます。つまり、 A または B を任意の順序で一致させたい場合は、次のようなものを生成します(?:.*A.*B)|(?:.*B.*A)。しかし、項の数が増えると、すべての順列をカバーすると、かなり巨大な正規表現が生成されます。

より良い解決策は、おそらく、各用語を個別の正規表現で照合し、単純なブール式ツリーを実装するなどして、自分で一致を結合することです。

于 2013-03-07T21:38:41.440 に答える
1

これを実現するために、先読みアサーションを使用できます(?= ... )。このようなアサーションは、代替 ( | ) を扱うときの順列の負担を克服します。

例えば:

^(?=.*?\bbridge\b)(?=.*?\b(car|boat)\b)

アサーションは「ゼロ幅」であるため、この例ではいずれかのアサーションが評価されると、まだ文字列の先頭にいます。事実上、このパターンは「文字列の先頭に一致する」ことを意味し、「「橋」と「車またはボート」の両方が文字列の先頭の後のある時点で見つかることを確認します。

各アサーションはクエリの AND 部分に対応します。OR は代替によって処理されます。これは、クエリが変更されると変わる可能性がありますが、例には当てはまります。

于 2013-03-07T21:47:56.753 に答える