カテゴリ:

文字列関数(正規表現)

REGEXP_LIKE

文字列が指定されたパターンに一致するかどうかを比較します。両方の入力はテキスト式でなければなりません。

REGEXP_LIKEは:doc:`LIKE<like>`関数に類似していますが、SQL LIKEパターン構文の代わりに`POSIX拡張正規表現<http://en.wikipedia.org/wiki/Regular_expression#POSIX_basic_and_extended>`_を使います。REGEXP_LIKEは、LIKEよりも複雑な一致条件をサポートします。

Tip

検索最適化サービスを使用すると、この関数を呼び出すクエリのパフォーマンスを向上させることができます。詳細については、 検索最適化サービス をご参照ください。

エイリアス:

:doc:`RLIKE <rlike>`(最初の構文)

構文

REGEXP_LIKE( <subject> , <pattern> [ , <parameters> ] ) 
Copy

引数

必須:

subject

一致を検索する文字列です。

pattern

一致するパターンです。

パターンの指定に関するガイドラインについては、 文字列関数(正規表現) をご参照ください。

オプション:

parameters

一致の検索に使用されるパラメーターを指定する1つ以上の文字の文字列です。サポートされている値:

パラメーター

説明

c

大文字と小文字を区別する一致

i

大文字と小文字を区別しない一致

m

複数行モード

e

部分一致を抽出

s

単一行モード POSIX ワイルドカード文字 . 一致 \n

デフォルト: c

詳細については、 正規表現のパラメーターの指定 をご参照ください。

戻り値

BOOLEAN値またはNULLを返します。

  • 一致する場合はTRUEを返します。

  • 一致しない場合はFALSEを返します。

  • いずれかの引数が NULL の場合は NULL を返します。

使用上の注意

  • 関数は暗黙的に両端でパターンを固定します(例えば、 '' は自動的に '^$' になり、 'ABC' は自動的に '^ABC$' になります)。たとえば、ABC``で始まる文字列と一致する場合、パターンは'ABC.*'``になります。

  • バックスラッシュ文字(\)はエスケープ文字です。詳細については、 一重引用符で囲まれた文字列定数での正規表現の指定 をご参照ください。

  • 使用上の注意については、正規表現関数の 一般的な使用上の注意 をご参照ください。

照合の詳細

Arguments with collation specifications currently aren't supported.

以下の例では、 REGEXP_LIKE 関数を使用しています。

正規表現のその他の例については、:doc:`REGEXP <regexp>`をご参照ください。

文字列に対する基本的な正規表現クエリの実行

都市の名前でテーブルを作成します。

CREATE OR REPLACE TABLE cities(city VARCHAR(20)); INSERT INTO cities VALUES ('Sacramento'), ('San Francisco'), ('San Luis Obispo'), ('San Jose'), ('Santa Barbara'), ('Palo Alto'), (NULL); 
Copy

``.*``をワイルドカードとして使用して、できるだけ多くの文字に一致させることができます。次の例は、文字列値の任意の場所でパターン``Fran``に一致します。

SELECT * FROM cities WHERE REGEXP_LIKE(city, '.*Fran.*'); 
Copy
+---------------+ | CITY | |---------------| | San Francisco | +---------------+ 

次の例では、大文字と小文字を区別しない一致のための``i``パラメーターを使用します。

SELECT * FROM cities WHERE REGEXP_LIKE(city, '.*fran.*', 'i'); 
Copy
+---------------+ | CITY | |---------------| | San Francisco | +---------------+ 

文字列値の先頭に一致するパターンを見つけるには、ワイルドカードを使用するクエリを実行します。

SELECT * FROM cities WHERE REGEXP_LIKE(city, 'san.*', 'i'); 
Copy
+-----------------+ | CITY | |-----------------| | San Francisco | | San Luis Obispo | | San Jose | | Santa Barbara | +-----------------+ 

ワイルドカードを使用して大文字と小文字を区別するクエリを実行するには、``i``パラメーターを省略します。

SELECT * FROM cities WHERE REGEXP_LIKE(city, 'san.*'); 
Copy
+------+ | CITY | |------| +------+ 

1つの単語の一致に``w+``メタ文字を、スペースやタブなどの1つの空白文字の一致に``s``を使用することができます。次のクエリは、1つの単語、その後に空白文字が続き、その後に1つの単語が続く値を検索します。

SELECT * FROM cities WHERE REGEXP_LIKE(city, '\\w+\\s\\w+'); 
Copy
+---------------+ | CITY | |---------------| | San Francisco | | San Jose | | Santa Barbara | | Palo Alto | +---------------+ 

クエリの出力に``San Luis Obispo``は含まれません。その値には、間にスペースを持つ2つの単語ではなく、最初の単語と2番目の単語の間にスペースを持つ3つの単語が含まれているためです。

正規表現では、多くの場合、大文字のメタ文字を使用して、小文字のメタ文字の意味を否定できます。たとえば、``S``メタ文字を使用して、2つの単語の間に空白文字を含まない値を検索するクエリを実行します。

SELECT * FROM cities WHERE REGEXP_LIKE(city, '\\w+\\S\\w+'); 
Copy
+------------+ | CITY | |------------| | Sacramento | +------------+ 

特殊文字を含む文字列に対しての正規表現クエリの実行

このセクションの例では、特殊文字を含む値を検索します。これは、az、AZ、アンダースコア(「_」)、または10進数以外の文字です。

メタ文字を検索するには、メタ文字をエスケープします。詳細については、 一重引用符で囲まれた文字列定数での正規表現の指定 をご参照ください。

テーブルを作成し、特殊文字を含むいくつかの値を挿入します。

CREATE OR REPLACE TABLE regex_special_characters(v VARCHAR(20)); INSERT INTO regex_special_characters VALUES ('Snow'), ('Sn.ow'), ('Sn@ow'), ('Sn$ow'), ('Sn\\ow'); 
Copy

最初の挿入値には特殊文字が含まれていません。

データを表示するには、テーブルをクエリします。

SELECT * FROM regex_special_characters; 
Copy
+-------+ | V | |-------| | Snow | | Sn.ow | | Sn@ow | | Sn$ow | | Sn\ow | +-------+ 

「単語」に使われる文字ではない文字を検索する``W``Perlバックスラッシュシーケンスを使用して、あらゆる特殊文字を検索できます。たとえば、次のクエリは、テーブル内の特殊文字を含む値を検索します。

SELECT * FROM regex_special_characters WHERE REGEXP_LIKE(v, '.*\\W.*'); 
Copy
+-------+ | V | |-------| | Sn.ow | | Sn@ow | | Sn$ow | | Sn\ow | +-------+ 

一重引用符で囲まれた文字列定数で:ref:`メタ文字を検索<label-regex_metacharacter>`するには、2つのバックスラッシュでメタ文字をエスケープする必要があります。たとえば、以下のクエリは``$``メタ文字を含む 値を検索します。

SELECT * FROM regex_special_characters WHERE REGEXP_LIKE(v, '.*\\$.*'); 
Copy
+-------+ | V | |-------| | Sn$ow | +-------+ 

バックスラッシュを検索する場合は、追加のバックスラッシュエスケープ文字が必要です。たとえば、以下のクエリは````または``.``メタ文字を含む 値を検索します。

SELECT * FROM regex_special_characters WHERE REGEXP_LIKE(v, '.*(\\.|\\\\).*'); 
Copy
+-------+ | V | |-------| | Sn.ow | | Sn\ow | +-------+