カテゴリ:

文字列関数(正規表現)

REGEXP

サブジェクトが指定されたパターンに一致する場合、trueを返します。両方の入力はテキスト式でなければなりません。

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

ちなみに

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

エイリアス

RLIKE (2番目の構文)

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

構文

<subject> REGEXP <pattern>
Copy

引数

必須:

subject

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

pattern

一致するパターン。

戻り値

戻り値のデータ型はBOOLEANです。

使用上の注意

  • 関数は暗黙的に両端でパターンを固定します(つまり、 '' は自動的に '^$' になり、 '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;
+---------------+
| V             |
|---------------|
| San Francisco |
+---------------+
Copy

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

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

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

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

select v, v regexp 'San\\b.*' AS MATCHES
    from strings
    order by v;
+-------------------------------------+---------+
| V                                   | MATCHES |
|-------------------------------------+---------|
| Contains embedded single \backslash | False   |
| Sacramento                          | False   |
| San Francisco                       | True    |
| San Jose                            | True    |
| Santa Clara                         | False   |
+-------------------------------------+---------+
Copy

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

select v, v regexp '.*\\s\\\\.*' AS MATCHES
    from strings
    order by v;
+-------------------------------------+---------+
| V                                   | MATCHES |
|-------------------------------------+---------|
| Contains embedded single \backslash | True    |
| Sacramento                          | False   |
| San Francisco                       | False   |
| San Jose                            | False   |
| Santa Clara                         | False   |
+-------------------------------------+---------+
Copy

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

select v, v regexp $$.*\s\\.*$$ AS MATCHES
    from strings
    order by v;
+-------------------------------------+---------+
| V                                   | MATCHES |
|-------------------------------------+---------|
| Contains embedded single \backslash | True    |
| Sacramento                          | False   |
| San Francisco                       | False   |
| San Jose                            | False   |
| Santa Clara                         | False   |
+-------------------------------------+---------+
Copy