カテゴリ:

文字列関数(正規表現)

[ NOT ] REGEXP

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

REGEXP は [ NOT ] LIKE 関数に似ていますが、 SQL LIKE パターン構文ではなく POSIX 拡張正規表現を使用します。LIKE よりも複雑な一致条件をサポートします。

Tip

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

エイリアス:

[ NOT ] RLIKE (2番目の構文)

文字列関数(正規表現) もご参照ください。

構文

<subject> [ NOT ] REGEXP <pattern>
Copy

引数

必須:

subject

一致するサブジェクトです。

pattern

一致するパターン。

戻り値

BOOLEAN または NULL を返します。

  • REGEXP を指定した場合、一致するときの値は TRUE。それ以外の場合は、 FALSE を返します。

  • NOT REGEXP を指定した場合、一致しない時の値は TRUE。それ以外の場合は、 FALSE を返します。

  • REGEXP か NOT REGEXP のどちらかを指定した場合、引数の中に NULL があれば NULL を返します。

使用上の注意

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

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

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

照合の詳細

Arguments with collation specifications are currently not supported.

以下の例は、単純なワイルドカード式で REGEXP を使用する方法を示しています。

テーブルを作成してデータをロードします。

CREATE OR REPLACE TABLE strings (v VARCHAR(50));
INSERT INTO strings (v) VALUES
    ('San Francisco'),
    ('San Jose'),
    ('Santa Clara'),
    ('Sacramento');
Copy

ワイルドカードを使用してパターンを検索します。

SELECT v
    FROM strings
    WHERE v REGEXP 'San* [fF].*'
    ORDER BY v;
Copy
+---------------+
| V             |
|---------------|
| San Francisco |
+---------------+

バックスラッシュ文字 \ は、正規表現のエスケープ文字であり、特殊文字または文字のグループを指定します。たとえば、 \s は空白の正規表現です。

リテラル文字列を解析するSnowflake文字列パーサーは、バックスラッシュをエスケープ文字 としても 扱います。たとえば、バックスラッシュ記号は、タブ文字を指定する文字シーケンスの一部として使用されます。したがって、単一のバックスラッシュ記号を含む文字列を作成するには、バックスラッシュ記号を 2つ 指定する必要があります。たとえば、以下の入力ステートメントの文字列を、出力の対応する文字列と比較します。

INSERT INTO strings (v) VALUES
    ('Contains embedded single \\backslash')
    ;
Copy
SELECT * 
    FROM strings
    ORDER BY v;
Copy
+-------------------------------------+
| V                                   |
|-------------------------------------|
| Contains embedded single \backslash |
| Sacramento                          |
| San Francisco                       |
| San Jose                            |
| Santa Clara                         |
+-------------------------------------+

この例は、「San」で始まる文字列を検索する方法を示しています。「San」は完全な単語です(例:「Santa」の一部ではない)。 \b は、単語境界のエスケープシーケンスです。

SELECT v, v regexp 'San\\b.*' AS MATCHES
    FROM strings
    ORDER BY v;
Copy
+-------------------------------------+---------+
| V                                   | MATCHES |
|-------------------------------------+---------|
| Contains embedded single \backslash | False   |
| Sacramento                          | False   |
| San Francisco                       | True    |
| San Jose                            | True    |
| Santa Clara                         | False   |
+-------------------------------------+---------+

この例は、空白とそれに続くバックスラッシュ記号を検索する方法を示しています。検索する単一のバックスラッシュは、以下の 4つ のバックスラッシュで表されることに注意してください。 REGEXP がリテラルのバックスラッシュを探すには、そのバックスラッシュをエスケープする必要があるため、2つのバックスラッシュが必要です。文字列パーサーでは、これらのバックスラッシュのそれぞれをエスケープする必要があるため、式には、式が検索する1つのバックスラッシュを表す4つのバックスラッシュが含まれています。

SELECT v, v regexp '.*\\s\\\\.*' AS MATCHES
    FROM strings
    ORDER BY v;
Copy
+-------------------------------------+---------+
| V                                   | MATCHES |
|-------------------------------------+---------|
| Contains embedded single \backslash | True    |
| Sacramento                          | False   |
| San Francisco                       | False   |
| San Jose                            | False   |
| Santa Clara                         | False   |
+-------------------------------------+---------+

次の例は、前の例と同じですが、 $$ を文字列区切り文字として使用して、文字列がリテラルであり、バックスラッシュをエスケープシーケンスとして解釈しないように指示しています。(バックスラッシュは引き続き REGEXP によってエスケープシーケンスとして解釈されます。)

SELECT v, v regexp $$.*\s\\.*$$ AS MATCHES
    FROM strings
    ORDER BY v;
Copy
+-------------------------------------+---------+
| V                                   | MATCHES |
|-------------------------------------+---------|
| Contains embedded single \backslash | True    |
| Sacramento                          | False   |
| San Francisco                       | False   |
| San Jose                            | False   |
| Santa Clara                         | False   |
+-------------------------------------+---------+