sql >> データベース >  >> RDS >> MariaDB

MariaDBでのREGEXP_REPLACE()のしくみ

    MariaDBでは、REGEXP_REPLACE() 関数は、指定された正規表現パターンに一致する文字列内の部分文字列の出現を置き換えます。

    文字列全体が置換とともに返されます。

    一致するものがない場合(つまり、入力文字列にサブ文字列が含まれていない場合)、文字列全体が変更されずに返されます。

    構文

    構文は次のようになります:

    REGEXP_REPLACE(subject, pattern, replace)

    subject 入力文字列、pattern は部分文字列の正規表現パターンであり、replace 置換文字列です。

    これを書いている時点では、MariaDBのバージョンのREGEXP_REPLACE() MySQLのREGEXP_REPLACE()よりも少ない引数を受け入れます 働き。 MySQLのバージョンでは、検索の開始位置、検索するオカレンスの引数、および一致タイプを使用して正規表現を絞り込む方法を提供できます。

    REGEXP_REPLACE()を使用する基本的な例を次に示します。 MariaDBの場合:

    SELECT REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird');

    結果:

    +------------------------------------------------+
    | REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird') |
    +------------------------------------------------+
    | Cats and birds                                 |
    +------------------------------------------------+

    この場合、一致があり、部分文字列は置換文字列に置き換えられます。

    正規表現は非常に強力である可能性があり、この例では非常に単純な例を使用しています。 REGEXP_REPLACE()を使用するには 事実上、望ましい結果を得るために使用する正しいパターンを知る必要があります。

    複数の一致

    複数の一致がある例を次に示します。

    SELECT REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird');

    結果:

    +----------------------------------------------------------+
    | REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird') |
    +----------------------------------------------------------+
    | My bird likes other birds                                |
    +----------------------------------------------------------+

    一致なし

    一致するものがない例を次に示します。

    SELECT REGEXP_REPLACE('Cats and dogs', 't.g', 'bird');

    結果:

    +------------------------------------------------+
    | REGEXP_REPLACE('Cats and dogs', 't.g', 'bird') |
    +------------------------------------------------+
    | Cats and dogs                                  |
    +------------------------------------------------+

    一致するものがないため、元の文字列は変更されずに返されます。

    大文字と小文字の区別

    REGEXP_REPLACE() 関数は、効果的な照合の大文字と小文字の区別の規則に従います。照合は、大文字と小文字を区別しない照合では大文字と小文字を区別せずに実行され、大文字と小文字を区別する照合とバイナリデータでは大文字と小文字を区別して実行されます。

    次に例を示します:

    SELECT 
        REGEXP_REPLACE('My Cats', 'c.t', 'dog') AS "My Default",
        REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_ci, 'c.t', 'dog') AS "Case Insensitive",
        REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_cs, 'c.t', 'dog') AS "Case Sensitive";

    結果:

    +------------+------------------+----------------+
    | My Default | Case Insensitive | Case Sensitive |
    +------------+------------------+----------------+
    | My dogs    | My dogs          | My Cats        |
    +------------+------------------+----------------+

    私のデフォルトの照合では大文字と小文字は区別されません。他の2つの文字列は、大文字と小文字を区別しない照合と大文字と小文字を区別する照合にそれぞれ強制されました。

    BINARYを提供する 文字列でも大文字と小文字が区別されます(これについては後で詳しく説明します)。

    大文字と小文字の区別を上書きする

    照合の大文字と小文字の区別は、(?iを使用してオーバーライドできます )および(?-i )PCREフラグ。

    これは前の例ですが、今回は(?-i)を使用しています 大文字と小文字を区別するために各パターンにフラグを付ける:

    SELECT 
        REGEXP_REPLACE('My Cats', '(?-i)c.t', 'dog') AS "My Default",
        REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_ci, '(?-i)c.t', 'dog') AS "Case Insensitive",
        REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_cs, '(?-i)c.t', 'dog') AS "Case Sensitive";

    結果:

    +------------+------------------+----------------+
    | My Default | Case Insensitive | Case Sensitive |
    +------------+------------------+----------------+
    | My Cats    | My Cats          | My Cats        |
    +------------+------------------+----------------+

    そしてここでは(?i)を使用しています 大文字と小文字を区別しないように強制するフラグ:

    SELECT 
        REGEXP_REPLACE('My Cats', '(?i)c.t', 'dog') AS "My Default",
        REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_ci, '(?i)c.t', 'dog') AS "Case Insensitive",
        REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_cs, '(?i)c.t', 'dog') AS "Case Sensitive";

    結果:

    +------------+------------------+----------------+
    | My Default | Case Insensitive | Case Sensitive |
    +------------+------------------+----------------+
    | My dogs    | My dogs          | My dogs        |
    +------------+------------------+----------------+

    バイナリ文字列

    BINARYを渡す 文字列は大文字と小文字の区別にも影響します。 BINARYを使用 文字列の場合、大文字は小文字とは異なります:

    例:

    SELECT 
        REGEXP_REPLACE('My Cats', 'c.t', 'dog') AS "Character",
        REGEXP_REPLACE(BINARY 'My Cats', 'c.t', 'dog') AS "Binary";

    結果:

    +-----------+---------+
    | Character | Binary  |
    +-----------+---------+
    | My dogs   | My Cats |
    +-----------+---------+

    大文字と小文字を変更すると、次のようになります。

    SELECT 
        REGEXP_REPLACE('My Cats', 'C.t', 'dog') AS "Character",
        REGEXP_REPLACE(BINARY 'My Cats', 'C.t', 'dog') AS "Binary";

    結果:

    +-----------+---------+
    | Character | Binary  |
    +-----------+---------+
    | My dogs   | My dogs |
    +-----------+---------+

    BINARYの大文字と小文字の区別 文字列は(?-i)で上書きすることもできます および(?i) PCREフラグ:

    SELECT 
        REGEXP_REPLACE('My Cats', '(?-i)c.t', 'dog') AS "Character",
        REGEXP_REPLACE(BINARY 'My Cats', '(?-i)c.t', 'dog') AS "Binary";

    結果:

    +-----------+---------+
    | Character | Binary  |
    +-----------+---------+
    | My Cats   | My Cats |
    +-----------+---------+

    ヌル引数

    nullを渡す 引数を指定するとnullになります。 :

    SELECT 
        REGEXP_REPLACE(null, 'c.t', 'dog') AS "1",
        REGEXP_REPLACE('Cat', null, 'dog') AS "2",
        REGEXP_REPLACE('Cat', 'c.t', null) AS "3",
        REGEXP_REPLACE(null, null, null) AS "4";

    結果:

    +------+------+------+------+
    | 1    | 2    | 3    | 4    |
    +------+------+------+------+
    | NULL | NULL | NULL | NULL |
    +------+------+------+------+

    引数の数が間違っています

    間違った数の引数を渡すか、引数を渡さないと、エラーが発生します:

    SELECT REGEXP_REPLACE();

    結果:

    ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_REPLACE'

    1. MySQLで名前utf8を設定しますか?

    2. 複数のビット値を単一のテーブル列に格納します

    3. Debian7でphpMyAdminを使用してMySQLをインストールする方法

    4. TSQLとGUIを使用してデータベースを削除する方法-SQLServer/TSQLチュートリアルパート25