MySQL 8.0 リファレンスマニュアル


12.8.2 正規表現

表 12.14 「正規表現関数および演算子」

名前 説明
NOT REGEXP REGEXP の否定
REGEXP 文字列が正規表現と一致するかどうか
REGEXP_INSTR() 正規表現に一致する部分文字列の開始インデックス
REGEXP_LIKE() 文字列が正規表現と一致するかどうか
REGEXP_REPLACE() 正規表現に一致する部分文字列の置換
REGEXP_SUBSTR() 正規表現に一致する部分文字列を返します
RLIKE 文字列が正規表現と一致するかどうか

正規表現は、複雑な検索でパターンを指定する強力な方法です。 このセクションでは、正規表現の照合に使用できる関数と演算子について説明し、正規表現の操作に使用できる特殊文字と構造の一部を例とともに示します。 セクション3.3.4.7「パターンマッチング」も参照してください。

MySQL では、Unicode の国際コンポーネント (ICU) を使用した正規表現サポートが実装されています。ICU は完全な Unicode サポートを提供し、マルチバイトセーフです。 (MySQL 8.0.4 より前では、MySQL は Henry Spencer による正規表現の実装を使用していました。これはバイト単位で動作し、マルチバイトセーフではありません。 正規表現を使用するアプリケーションが実装の変更の影響を受ける方法の詳細は、正規表現の互換性に関する考慮事項 を参照してください。)

正規表現関数および演算子

  • expr NOT REGEXP pat, expr NOT RLIKE pat

    これは、NOT (expr REGEXP pat) と同じです。

  • expr REGEXP pat, expr RLIKE pat

    文字列 expr がパターン pat で指定された正規表現と一致する場合は 1 を返し、一致しない場合は 0 を返します。 expr または patNULL の場合、戻り値は NULL です。

    REGEXP および RLIKE は、REGEXP_LIKE() のシノニムです。

    照合の実行方法の詳細は、REGEXP_LIKE() の説明を参照してください。

    mysql> SELECT 'Michael!' REGEXP '.*';
    +------------------------+
    | 'Michael!' REGEXP '.*' |
    +------------------------+
    |                      1 |
    +------------------------+
    mysql> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';
    +---------------------------------------+
    | 'new*\n*line' REGEXP 'new\\*.\\*line' |
    +---------------------------------------+
    |                                     0 |
    +---------------------------------------+
    mysql> SELECT 'a' REGEXP '^[a-d]';
    +---------------------+
    | 'a' REGEXP '^[a-d]' |
    +---------------------+
    |                   1 |
    +---------------------+
    mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
    +----------------+-----------------------+
    | 'a' REGEXP 'A' | 'a' REGEXP BINARY 'A' |
    +----------------+-----------------------+
    |              1 |                     0 |
    +----------------+-----------------------+
  • REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])

    パターン pat で指定された正規表現に一致する文字列 expr の部分文字列の開始インデックスを返します。一致がない場合は 0 を返します。 expr または patNULL の場合、戻り値は NULL です。 文字インデックスは 1 から始まります。

    REGEXP_INSTR() は、次のオプションの引数を取ります:

    • pos: 検索を開始する expr 内の位置。 省略した場合、デフォルトは 1 です。

    • occurrence: 検索する一致のオカレンス。 省略した場合、デフォルトは 1 です。

    • return_option: 返す位置のタイプ。 この値が 0 の場合、REGEXP_INSTR() は一致した部分文字列の最初の文字の位置を戻します。 この値が 1 の場合、REGEXP_INSTR() は一致した部分文字列の後の位置を戻します。 省略した場合、デフォルトは 0 です。

    • match_type: 照合の実行方法を指定する文字列。 意味は、REGEXP_LIKE() で説明されているとおりです。

    照合の実行方法の詳細は、REGEXP_LIKE() の説明を参照してください。

    mysql> SELECT REGEXP_INSTR('dog cat dog', 'dog');
    +------------------------------------+
    | REGEXP_INSTR('dog cat dog', 'dog') |
    +------------------------------------+
    |                                  1 |
    +------------------------------------+
    mysql> SELECT REGEXP_INSTR('dog cat dog', 'dog', 2);
    +---------------------------------------+
    | REGEXP_INSTR('dog cat dog', 'dog', 2) |
    +---------------------------------------+
    |                                     9 |
    +---------------------------------------+
    mysql> SELECT REGEXP_INSTR('aa aaa aaaa', 'a{2}');
    +-------------------------------------+
    | REGEXP_INSTR('aa aaa aaaa', 'a{2}') |
    +-------------------------------------+
    |                                   1 |
    +-------------------------------------+
    mysql> SELECT REGEXP_INSTR('aa aaa aaaa', 'a{4}');
    +-------------------------------------+
    | REGEXP_INSTR('aa aaa aaaa', 'a{4}') |
    +-------------------------------------+
    |                                   8 |
    +-------------------------------------+
  • REGEXP_LIKE(expr, pat[, match_type])

    文字列 expr がパターン pat で指定された正規表現と一致する場合は 1 を返し、一致しない場合は 0 を返します。 expr または patNULL の場合、戻り値は NULL です。

    パターンには、正規表現構文 で説明されている構文である拡張正規表現を使用できます。 パターンはリテラル文字列である必要はありません。 たとえば、文字列式やテーブルカラムとして指定できます。

    オプションの match_type 引数は、照合の実行方法を指定する次の文字の一部またはすべてを含むことができる文字列です:

    • c: 大文字小文字を区別する照合。

    • i: 大文字小文字を区別しない照合。

    • m: Multiple-line mode. 文字列内の行終了記号を認識します。 デフォルトの動作では、文字列式の先頭と末尾でのみ行終了記号が照合されます。

    • n: . 文字は行終了記号と一致します。 デフォルトでは、. 照合は行の最後で停止します。

    • u: Unix 専用の行の終わり。 改行文字のみが、.^ および $ の一致演算子で終わる行として認識されます。

    矛盾するオプションを指定する文字が match_type 内で指定されている場合は、右端の文字が優先されます。

    デフォルトでは、正規表現操作は、文字のタイプを決定して比較を実行するときに、expr および pat 引数の文字セットと照合順序を使用します。 引数にさまざまな文字セットまたは照合順序が含まれる場合は、セクション10.8.4「式での照合の強制性」で説明するとおりに、型変換属性ルールが適用されます。 引数は、比較動作を変更するために、明示的な照合インジケータとともに指定できます。

    mysql> SELECT REGEXP_LIKE('CamelCase', 'CAMELCASE');
    +---------------------------------------+
    | REGEXP_LIKE('CamelCase', 'CAMELCASE') |
    +---------------------------------------+
    |                                     1 |
    +---------------------------------------+
    mysql> SELECT REGEXP_LIKE('CamelCase', 'CAMELCASE' COLLATE utf8mb4_0900_as_cs);
    +------------------------------------------------------------------+
    | REGEXP_LIKE('CamelCase', 'CAMELCASE' COLLATE utf8mb4_0900_as_cs) |
    +------------------------------------------------------------------+
    |                                                                0 |
    +------------------------------------------------------------------+

    match_type は、デフォルトの大/小文字の区別をオーバーライドするために、c または i 文字とともに指定できます。 例外: いずれかの引数がバイナリ文字列の場合、match_typei 文字が含まれていても、引数は大/小文字を区別してバイナリ文字列として処理されます。

    注記

    MySQL では文字列で C エスケープ構文 (改行文字を表す\n など) が使用されるため、expr および pat 引数で使用する\をダブルクリックする必要があります。

    mysql> SELECT REGEXP_LIKE('Michael!', '.*');
    +-------------------------------+
    | REGEXP_LIKE('Michael!', '.*') |
    +-------------------------------+
    |                             1 |
    +-------------------------------+
    mysql> SELECT REGEXP_LIKE('new*\n*line', 'new\\*.\\*line');
    +----------------------------------------------+
    | REGEXP_LIKE('new*\n*line', 'new\\*.\\*line') |
    +----------------------------------------------+
    |                                            0 |
    +----------------------------------------------+
    mysql> SELECT REGEXP_LIKE('a', '^[a-d]');
    +----------------------------+
    | REGEXP_LIKE('a', '^[a-d]') |
    +----------------------------+
    |                          1 |
    +----------------------------+
    mysql> SELECT REGEXP_LIKE('a', 'A'), REGEXP_LIKE('a', BINARY 'A');
    +-----------------------+------------------------------+
    | REGEXP_LIKE('a', 'A') | REGEXP_LIKE('a', BINARY 'A') |
    +-----------------------+------------------------------+
    |                     1 |                            0 |
    +-----------------------+------------------------------+
    mysql> SELECT REGEXP_LIKE('abc', 'ABC');
    +---------------------------+
    | REGEXP_LIKE('abc', 'ABC') |
    +---------------------------+
    |                         1 |
    +---------------------------+
    mysql> SELECT REGEXP_LIKE('abc', 'ABC', 'c');
    +--------------------------------+
    | REGEXP_LIKE('abc', 'ABC', 'c') |
    +--------------------------------+
    |                              0 |
    +--------------------------------+
  • REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])

    パターン pat で指定された正規表現に一致する文字列 expr 内のオカレンスを置換文字列 repl で置換し、結果の文字列を戻します。 exprpat または replNULL の場合、戻り値は NULL です。

    REGEXP_REPLACE() は、次のオプションの引数を取ります:

    • pos: 検索を開始する expr 内の位置。 省略した場合、デフォルトは 1 です。

    • occurrence: 置換する一致のオカレンス。 省略した場合、デフォルトは 0 (「すべて置換」を意味します) です。

    • match_type: 照合の実行方法を指定する文字列。 意味は、REGEXP_LIKE() で説明されているとおりです。

    MySQL 8.0.17 より前は、この関数によって戻された結果で UTF-16 文字セットが使用されていました。MySQL 8.0.17 以降では、一致を検索した式の文字セットおよび照合順序が使用されます。 (Bug #94203、Bug #29308212)

    照合の実行方法の詳細は、REGEXP_LIKE() の説明を参照してください。

    mysql> SELECT REGEXP_REPLACE('a b c', 'b', 'X');
    +-----------------------------------+
    | REGEXP_REPLACE('a b c', 'b', 'X') |
    +-----------------------------------+
    | a X c                             |
    +-----------------------------------+
    mysql> SELECT REGEXP_REPLACE('abc def ghi', '[a-z]+', 'X', 1, 3);
    +----------------------------------------------------+
    | REGEXP_REPLACE('abc def ghi', '[a-z]+', 'X', 1, 3) |
    +----------------------------------------------------+
    | abc def X                                          |
    +----------------------------------------------------+
  • REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])

    一致がない場合は、patNULL パターンで指定された正規表現に一致する文字列 expr の部分文字列を返します。 expr または patNULL の場合、戻り値は NULL です。

    REGEXP_SUBSTR() は、次のオプションの引数を取ります:

    • pos: 検索を開始する expr 内の位置。 省略した場合、デフォルトは 1 です。

    • occurrence: 検索する一致のオカレンス。 省略した場合、デフォルトは 1 です。

    • match_type: 照合の実行方法を指定する文字列。 意味は、REGEXP_LIKE() で説明されているとおりです。

    MySQL 8.0.17 より前は、この関数によって戻された結果で UTF-16 文字セットが使用されていました。MySQL 8.0.17 以降では、一致を検索した式の文字セットおよび照合順序が使用されます。 (Bug #94203、Bug #29308212)

    照合の実行方法の詳細は、REGEXP_LIKE() の説明を参照してください。

    mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+');
    +----------------------------------------+
    | REGEXP_SUBSTR('abc def ghi', '[a-z]+') |
    +----------------------------------------+
    | abc                                    |
    +----------------------------------------+
    mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+', 1, 3);
    +----------------------------------------------+
    | REGEXP_SUBSTR('abc def ghi', '[a-z]+', 1, 3) |
    +----------------------------------------------+
    | ghi                                          |
    +----------------------------------------------+

正規表現構文

正規表現では、文字列のセットが記述されます。 もっとも単純な正規表現は、特殊文字を使用していないものです。 たとえば、正規表現 hellohello にのみ一致します。

重要な正規表現では、複数の文字列に一致できるように特定の特殊構造が使用されます。 たとえば、正規表現 hello|world には|代替演算子が含まれ、hello または world のいずれかと一致します。

さらに複雑な例として、正規表現 B[an]*s は、文字列 BananasBaaaaasBs のいずれか、および B で始まり、s で終わり、その間に任意の数字の a または n 文字が含まれるその他の文字列に一致します。

次のリストは、正規表現で使用できる基本的な特殊文字と構造体の一部を示しています。 正規表現サポートの実装に使用される ICU ライブラリでサポートされる完全な正規表現構文の詳細は、「Unicode web サイトの国際コンポーネント」を参照してください。

  • ^

    文字列の先頭に一致します。

    mysql> SELECT REGEXP_LIKE('fo\nfo', '^fo$');                   -> 0
    mysql> SELECT REGEXP_LIKE('fofo', '^fo');                      -> 1
  • $

    文字列の末尾に一致します。

    mysql> SELECT REGEXP_LIKE('fo\no', '^fo\no$');                 -> 1
    mysql> SELECT REGEXP_LIKE('fo\no', '^fo$');                    -> 0
  • .

    任意の文字に一致します (キャリッジリターンおよび改行を含むが、文字列の途中でこれらを一致させるには、m (複数行) の一致制御文字または (?m) のパターン内修飾子を指定する必要があります)。

    mysql> SELECT REGEXP_LIKE('fofo', '^f.*$');                    -> 1
    mysql> SELECT REGEXP_LIKE('fo\r\nfo', '^f.*$');                -> 0
    mysql> SELECT REGEXP_LIKE('fo\r\nfo', '^f.*$', 'm');           -> 1
    mysql> SELECT REGEXP_LIKE('fo\r\nfo', '(?m)^f.*$');           -> 1
  • a*

    ゼロ個以上の a 文字のシーケンスに一致します。

    mysql> SELECT REGEXP_LIKE('Ban', '^Ba*n');                     -> 1
    mysql> SELECT REGEXP_LIKE('Baaan', '^Ba*n');                   -> 1
    mysql> SELECT REGEXP_LIKE('Bn', '^Ba*n');                      -> 1
  • a+

    1 個以上の a 文字のシーケンスに一致します。

    mysql> SELECT REGEXP_LIKE('Ban', '^Ba+n');                     -> 1
    mysql> SELECT REGEXP_LIKE('Bn', '^Ba+n');                      -> 0
  • a?

    ゼロまたは 1 個の a 文字に一致します。

    mysql> SELECT REGEXP_LIKE('Bn', '^Ba?n');                      -> 1
    mysql> SELECT REGEXP_LIKE('Ban', '^Ba?n');                     -> 1
    mysql> SELECT REGEXP_LIKE('Baan', '^Ba?n');                    -> 0
  • de|abc

    代替。順序 de または abc のいずれかに一致します。

    mysql> SELECT REGEXP_LIKE('pi', 'pi|apa');                     -> 1
    mysql> SELECT REGEXP_LIKE('axe', 'pi|apa');                    -> 0
    mysql> SELECT REGEXP_LIKE('apa', 'pi|apa');                    -> 1
    mysql> SELECT REGEXP_LIKE('apa', '^(pi|apa)$');                -> 1
    mysql> SELECT REGEXP_LIKE('pi', '^(pi|apa)$');                 -> 1
    mysql> SELECT REGEXP_LIKE('pix', '^(pi|apa)$');                -> 0
  • (abc)*

    シーケンス abc のゼロ個以上のインスタンスに一致します。

    mysql> SELECT REGEXP_LIKE('pi', '^(pi)*$');                    -> 1
    mysql> SELECT REGEXP_LIKE('pip', '^(pi)*$');                   -> 0
    mysql> SELECT REGEXP_LIKE('pipi', '^(pi)*$');                  -> 1
  • {1}, {2,3}

    繰返し: {n} および {m,n} 表記法では、パターンの以前の原子 (または「ピース」) の多くの出現に一致する正規表現を記述するより一般的な方法が提供されます。m および n は整数です。

    • a*

      a{0,} と記述できます。

    • a+

      a{1,} と記述できます。

    • a?

      a{0,1} と記述できます。

    より正確にするために、a{n}an インスタンスと完全に一致します。a{ n,} は、an 以上のインスタンスと一致します。a{m, n } は、an インスタンス (これを含む) を介して m を照合します。 m および n の両方が指定されている場合は、mn 以下にする必要があります。

    mysql> SELECT REGEXP_LIKE('abcde', 'a[bcd]{2}e');              -> 0
    mysql> SELECT REGEXP_LIKE('abcde', 'a[bcd]{3}e');              -> 1
    mysql> SELECT REGEXP_LIKE('abcde', 'a[bcd]{1,10}e');           -> 1
  • [a-dX], [^a-dX]

    a, b, c, d または X のいずれかである (または ^ が使用されている場合はそうでない) 任意の文字に一致します。 2 つの文字の間の - 文字によって、1 番目の文字から 2 番目の文字までのすべての文字に一致する範囲が形成されます。 たとえば、[0-9] は任意の 10 進数に一致します。 リテラル文字 ] を含めるには、左括弧 [ の直後に記述する必要があります。 リテラル文字 - を含めるには、先頭または末尾に記述する必要があります。 [] ペアの内側に定義された特殊な意味を持たない文字は、それ自体としか一致しません。

    mysql> SELECT REGEXP_LIKE('aXbc', '[a-dXYZ]');                 -> 1
    mysql> SELECT REGEXP_LIKE('aXbc', '^[a-dXYZ]$');               -> 0
    mysql> SELECT REGEXP_LIKE('aXbc', '^[a-dXYZ]+$');              -> 1
    mysql> SELECT REGEXP_LIKE('aXbc', '^[^a-dXYZ]+$');             -> 0
    mysql> SELECT REGEXP_LIKE('gheis', '^[^a-dXYZ]+$');            -> 1
    mysql> SELECT REGEXP_LIKE('gheisa', '^[^a-dXYZ]+$');           -> 0
  • [=character_class=]

    ([] 使用して記述された) 括弧式内の [=character_class=] は、等価クラスを表します。 これは、同じ照合順序値を持つすべての文字 (それ自体を含む) に一致します。 たとえば、o および (+) が等価クラスのメンバーである場合、[[=o=]][[=(+)=]]、および [o(+)] はすべてシノニムです。 等価クラスは、範囲の終点として使用できない場合もあります。

  • [:character_class:]

    ([] を使用して記述された)括弧式内の [:character_class:] は、そのクラスに属するすべての文字と一致する文字クラスを表します。 次の表には、標準のクラス名を一覧表示します。 これらの名前は、ctype(3) のマニュアルページで定義されている文字クラスを表しています。 特定のロケールでは、ほかのクラス名が提供される場合もあります。 文字クラスは、範囲の終点として使用できない場合もあります。

    文字クラス名 意味
    alnum 英数文字
    alpha アルファベット文字
    blank 空白文字
    cntrl 制御文字
    digit 数字文字
    graph 図形文字
    lower 小文字アルファベット文字
    print 図形または空白文字
    punct 句読点文字
    space 空白、タブ、改行、および復帰改行
    upper 大文字アルファベット文字
    xdigit 16 進数文字
    mysql> SELECT REGEXP_LIKE('justalnums', '[[:alnum:]]+');       -> 1
    mysql> SELECT REGEXP_LIKE('!!', '[[:alnum:]]+');               -> 0

正規表現で特殊文字のリテラルインスタンスを使用するには、前に 2 つのバックスラッシュ (\) 文字を付けます。 MySQL パーサーが 2 つのバックスラッシュの一方を解釈し、正規表現ライブラリがもう一方を解釈します。 たとえば、特殊文字 + を含む文字列 1+2 に一致する正規表現は、次のうちで最後のものだけです。

mysql> SELECT REGEXP_LIKE('1+2', '1+2');                       -> 0
mysql> SELECT REGEXP_LIKE('1+2', '1\+2');                      -> 0
mysql> SELECT REGEXP_LIKE('1+2', '1\\+2');                     -> 1

正規表現のリソース制御

REGEXP_LIKE() および同様の関数は、システム変数を設定することで制御できるリソースを使用します:

  • 照合エンジンは、内部スタックにメモリーを使用します。 スタックで使用可能な最大メモリーをバイト単位で制御するには、regexp_stack_limit システム変数を設定します。

  • 照合エンジンはステップで動作します。 エンジンによって実行されるステップの最大数 (つまり、間接的に実行時間) を制御するには、regexp_time_limit システム変数を設定します。 この制限はステップ数で表されるため、実行時間には間接的にのみ影響します。 通常はミリ秒の順序で表示されます。

正規表現の互換性に関する考慮事項

MySQL 8.0.4 より前は、MySQL は、International Components for Unicode (ICU) ではなく Henry Spencer 正規表現ライブラリを使用して正規表現操作をサポートしていました。 次の説明では、アプリケーションに影響を与える可能性のある Spencer ライブラリと ICU ライブラリの違いについて説明します:

  • Spencer ライブラリでは、REGEXP および RLIKE 演算子はバイト単位で動作するため、マルチバイトセーフではなく、マルチバイト文字セットで予期しない結果が発生する可能性があります。 さらに、これらの演算子ではそのバイト値に基づいて文字が比較されるため、アクセント記号付き文字は、指定された照合順序では等しいとみなされた場合でも、等しいとして比較されない可能性があります。

    ICU では Unicode が完全にサポートされており、マルチバイトセーフです。 その正規表現関数は、すべての文字列を UTF-16 として扱います。 位置インデックスは、コードポイントではなく 16 ビットチャンクに基づいていることに注意してください。 つまり、このような関数に渡された場合、複数のチャンクを使用する文字は、次に示すような予期しない結果を生成する可能性があります:

    mysql> SELECT REGEXP_INSTR('🍣🍣b', 'b');
    +--------------------------+
    | REGEXP_INSTR('??b', 'b') |
    +--------------------------+
    |                        5 |
    +--------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT REGEXP_INSTR('🍣🍣bxxx', 'b', 4);
    +--------------------------------+
    | REGEXP_INSTR('??bxxx', 'b', 4) |
    +--------------------------------+
    |                              5 |
    +--------------------------------+
    1 row in set (0.00 sec)

    ほとんどの最新言語で使用される文字を含む Unicode Basic Multilingual Plane 内の文字は、次の点で安全です:

    mysql> SELECT REGEXP_INSTR('бжb', 'b');
    +----------------------------+
    | REGEXP_INSTR('бжb', 'b')   |
    +----------------------------+
    |                          3 |
    +----------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT REGEXP_INSTR('עבb', 'b');
    +----------------------------+
    | REGEXP_INSTR('עבb', 'b')   |
    +----------------------------+
    |                          3 |
    +----------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT REGEXP_INSTR('µå周çб', '周');
    +------------------------------------+
    | REGEXP_INSTR('µå周çб', '周')       |
    +------------------------------------+
    |                                  3 |
    +------------------------------------+
    1 row in set (0.00 sec)

    最初の 2 つの例で使用されている「寿司」文字 (U+1F363) などの絵文字は、基本多言語プレーンではなく Unicode 補助多言語プレーンに含まれています。 REGEXP_SUBSTR() または同様の関数が文字の途中で検索を開始すると、emoji およびその他の 4 バイト文字で別の問題が発生する可能性があります。 次の例の 2 つのステートメントはそれぞれ、最初の引数の 2 バイト目の位置から始まります。 最初のステートメントは、2 バイト (BMP) 文字のみで構成される文字列に対して機能します。 2 番目のステートメントには 4 バイトの文字が含まれており、最初の 2 バイトが取り除かれ、残りの文字データが正しく配置されていないため、結果で正しく解釈されません。

    mysql> SELECT REGEXP_SUBSTR('周周周周', '.*', 2);
    +----------------------------------------+
    | REGEXP_SUBSTR('周周周周', '.*', 2)     |
    +----------------------------------------+
    | 周周周                                 |
    +----------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT REGEXP_SUBSTR('🍣🍣🍣🍣', '.*', 2);
    +--------------------------------+
    | REGEXP_SUBSTR('????', '.*', 2) |
    +--------------------------------+
    | ?㳟揘㳟揘㳟揘                  |
    +--------------------------------+
    1 row in set (0.00 sec)
  • . 演算子の場合、Spencer ライブラリは、文字列式の任意の場所 (中央を含む) の行終了文字 (キャリッジリターン、改行) と一致します。 文字列の途中にある行末文字を ICU と照合するには、m の一致制御文字を指定します。

  • Spencer ライブラリは、ワードスタート境界マーカーとワードエンド境界マーカー ([[:<:]]および[[:>:]]表記法) をサポートしています。 ICU はそうではありません。 ICU の場合、\b を使用して単語境界を照合できます。MySQL では文字列内のエスケープ文字として解釈されるため、バックスラッシュをダブルクリックします。

  • Spencer ライブラリは、照合要素ブラケット式 ([.characters.]表記法) をサポートしています。 ICU はそうではありません。

  • 繰返し回数 ({n} および {m,n} 表記) の場合、Spencer ライブラリの最大数は 255 です。 ICU にはこのような制限はありませんが、照合エンジンステップの最大数は regexp_time_limit システム変数を設定することで制限できます。

  • ICU はカッコをメタ文字として解釈します。 リテラルの左カッコまたは右カッコ (を正規表現で指定するには、エスケープする必要があります:

    mysql> SELECT REGEXP_LIKE('(', '(');
    ERROR 3692 (HY000): Mismatched parenthesis in regular expression.
    mysql> SELECT REGEXP_LIKE('(', '\\(');
    +-------------------------+
    | REGEXP_LIKE('(', '\\(') |
    +-------------------------+
    |                       1 |
    +-------------------------+
    mysql> SELECT REGEXP_LIKE(')', ')');
    ERROR 3692 (HY000): Mismatched parenthesis in regular expression.
    mysql> SELECT REGEXP_LIKE(')', '\\)');
    +-------------------------+
    | REGEXP_LIKE(')', '\\)') |
    +-------------------------+
    |                       1 |
    +-------------------------+
  • ICU は大カッコもメタ文字として解釈しますが、リテラル文字として使用するには、左大カッコのみをエスケープする必要があります:

    mysql> SELECT REGEXP_LIKE('[', '[');
    ERROR 3696 (HY000): The regular expression contains an
    unclosed bracket expression.
    mysql> SELECT REGEXP_LIKE('[', '\\[');
    +-------------------------+
    | REGEXP_LIKE('[', '\\[') |
    +-------------------------+
    |                       1 |
    +-------------------------+
    mysql> SELECT REGEXP_LIKE(']', ']');
    +-----------------------+
    | REGEXP_LIKE(']', ']') |
    +-----------------------+
    |                     1 |
    +-----------------------+

関連キーワード:  REGEXP, 関数, 文字, 一致, 照合, expr, INSTR, pat, abc, SUBSTR