4

MySQLのマニュアルでは、サポートする式についてあまり詳しく説明されていないため、MySQLで次のことが可能かどうかはわかりません。

以下に一致するRLIKEを使用してクエリを作成しようとしています。

タスクは、SQLから、指定された文から少なくとも任意の2つの単語を含むすべての文を取得することです。

たとえば、正規表現で使用する特定の単語がいくつかあります。

hello, dog

データベースに次の文があります。

hello from dog
hello hello cat
dog says hello
dog dog goes away
big bad dog

それらすべてから私は一致したいだけです

hello from dog
dog says hello

今のところ私はこのようにそれを持っています:

SELECT *
FROM test
WHERE 
test RLIKE '(hello|dog).*(hello|dog)'

問題は-私はそれらも不要になります

hello hello cat
dog dog goes away

したがって、2番目の直前(hello | dog)に後方参照が必要だと思います。

擬似コードでは、次のようになります。

RLIKE '(hello OR dog) anything can be here (hello OR dog, but not the word which already was in the previous group)'

したがって、次のようになります。

'(hello|dog).*(negative backreference to the 1st group goes here)(hello|dog)'

このような負の後方参照は、MySQL正規表現で実行できますか?または、同じことを行う正規表現を作成するためのより良い方法があるかもしれませんが、クエリがC ++コードによって生成されることを考慮すると、生成するのに複雑すぎないようにする必要がありますか?

4

1 に答える 1

6

MySQLはPosix拡張正規表現エンジンPOSIX ERE)を使用しているため、後方参照をまったくサポートしていません。また、これを処理できる単一の正規表現を構築するために必要なルックアラウンドもサポートしていません。

したがって、考えられるすべての組み合わせを詳しく説明する必要があります。

hello.*dog|dog.*hello

もちろん、一致候補の数が増えるとこれは扱いにくくなるため、LIB_MYSQLUDF_PREGをインストール/使用できない限り、正規表現はMySQLでこれに適したツールではありません。

于 2010-11-08T10:18:31.920 に答える