web-dev-qa-db-ja.com

PostgreSQL正規表現の単語境界?

PostgreSQLは\bをサポートしていますか?

\bAB\bを試していますが、何も一致しませんが、(\W|^)AB(\W|$)は一致しません。これら2つの表現は基本的に同じですよね?

60
mpen

PostgreSQLは\m\M\yおよび\Y単語の境界として:

\m   matches only at the beginning of a Word
\M   matches only at the end of a Word
\y   matches only at the beginning or end of a Word
\Y   matches only at a point that is not the beginning or end of a Word 

マニュアルの Regular Expression Constraint Escapes を参照してください。

もあります [[:<:]]および[[:>:]]、これは単語の最初と最後に一致します。 マニュアル から:

ブラケット式には2つの特殊なケースがあります。ブラケット式[[:<:]]および[[:>:]]は制約であり、Wordの最初と最後の空の文字列にそれぞれ一致します。 Wordは、Word文字の前にも後にもない一連のWord文字として定義されます。 Word文字は、(ctypeで定義されている)列挙文字または下線です。これは拡張機能であり、POSIX 1003.2と互換性がありますが指定されていません。他のシステムへの移植を目的としたソフトウェアでは注意して使用する必要があります。以下で説明する制約エスケープは、通常は推奨されます(これは標準ではなくなりましたが、入力は確かに容易です)。

73

簡単な例

select * from table_name where column ~* '\yAB\y';

これはABabab - texttext abtext ABtext-ab-texttext AB text ...と一致します。

ただし、以下を使用する必要があります。

select * from sometable where name ~* '\\yAB\\y';

standard_conforming_stringsフラグがOFFに設定されている場合。 ダブルスラッシュに注意してください。
手動で設定できます:

set standard_conforming_strings=on;

その後、:select * from table_name where column ~* '\yAB\y';が機能するはずです。

14

テキストでの完全な単語検索:

次の問題に直面していました。

タイトルに「cto」が正確な単語として含まれるすべての連絡先を検索したいのですが、結果に「director」が含まれるタイトルで結果が得られたため、次のクエリを使用していました。

select * from contacts where title ilike '%cto%';

また、ワイルドカードの周りのホワイトスペースを「%cto%」として試しました。「cto」を含むテキストと一致し、「vp、cto、manger」のような結果が得られましたが、正確なタイトルが「cto」の結果は得られませんでした。

結果には「vp、cto、manger」と「cto」の両方が必要でしたが、結果には「director」は必要ありませんでした

次は私のために働いた

select * from contacts where title ~* '\\ycto\\y';

~   Matches regular expression, case sensitive
~*  Matches regular expression, case insensitive    
2
Pramod Shinde