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

MySQLでのREGEXP_INSTR()関数のしくみ

    MySQLでは、 REGEXP_INSTR() 関数は、正規表現パターンに一致する部分文字列の開始インデックスを返します。

    インデックスは1から始まります 。一致するものがない場合、結果は 0になります。 。

    構文

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

    REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])

    expr 入力文字列であり、 pat 部分文字列の正規表現パターンです。

    オプションのpos 引数を使用すると、文字列内の位置を指定して検索を開始できます。省略した場合、位置1から始まります。

    オプションのoccurrence 引数を使用すると、検索する一致のオカレンスを指定できます。省略した場合、最初のオカレンスが使用されます(オカレンス1)。

    オプションのreturn_option 引数を使用すると、返す位置のタイプを指定できます。 0を使用する場合 、一致する部分文字列の最初の文字の位置を返します。 1を使用する場合 次の最初の文字の位置を返します 一致する部分文字列。省略した場合、値は 0です。 。

    オプションのmatch_type 引数を使用すると、正規表現を改良できます。たとえば、この引数を使用して、大文字と小文字を区別する一致を指定するかどうかを指定できます。

    例1-基本的な使用法

    基本的な例は次のとおりです。

    SELECT REGEXP_INSTR('Cat', 'at') Result;

    結果:

    +--------+
    | Result |
    +--------+
    |      2 |
    +--------+
    

    この場合、一致があり、部分文字列は位置2から始まります。

    例2–一致なし

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

    SELECT REGEXP_INSTR('Cat', '^at') Result;

    結果:

    +--------+
    | Result |
    +--------+
    |      0 |
    +--------+
    

    一致するものがないため、結果は 0になります。 。文字列は部分文字列で始まる必要があると指定したため、一致するものはありません。

    そうするように変更しましょう その部分文字列から始めます:

    SELECT REGEXP_INSTR('at', '^at') Result;

    結果:

    +--------+
    | Result |
    +--------+
    |      1 |
    +--------+
    

    例3– pos 引数

    開始位置を指定する例を次に示します。

    SELECT REGEXP_INSTR('Cat Cat', 'Cat', 2) Result;

    結果:

    +--------+
    | Result |
    +--------+
    |      5 |
    +--------+
    

    したがって、2番目のオカレンスのインデックスを取得します。

    開始位置を指定した場所に関係なく、インデックスは位置1からカウントを開始することに注意してください。

    次の例は、これをより明確に示しています。

    SELECT 
      REGEXP_INSTR('Cat Cat', 'Cat', 2) AS 'Pos 2', 
      REGEXP_INSTR('Cat Cat', 'Cat', 3) AS 'Pos 3', 
      REGEXP_INSTR('Cat Cat', 'Cat', 5) AS 'Pos 5';

    結果:

    +-------+-------+-------+
    | Pos 2 | Pos 3 | Pos 5 |
    +-------+-------+-------+
    |     5 |     5 |     5 |
    +-------+-------+-------+
    

    もちろん、正規表現パターンによっては、これによって完全に異なる部分文字列のインデックスが返される場合があります。例:

    SELECT 
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1) 'Pos 1',
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2) 'Pos 2',
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 6) 'Pos 6';

    結果:

    +-------+-------+-------+
    | Pos 1 | Pos 2 | Pos 6 |
    +-------+-------+-------+
    |     1 |     5 |    16 |
    +-------+-------+-------+
    

    REGEXP_SUBSTR()で部分文字列を確認できます 機能:

    SELECT 
      REGEXP_SUBSTR('Cat City is SO Cute!', 'C.t', 1) 'Pos 1',
      REGEXP_SUBSTR('Cat City is SO Cute!', 'C.t', 2) 'Pos 2',
      REGEXP_SUBSTR('Cat City is SO Cute!', 'C.t', 6) 'Pos 6';

    結果:

    +-------+-------+-------+
    | Pos 1 | Pos 2 | Pos 6 |
    +-------+-------+-------+
    | Cat   | Cit   | Cut   |
    +-------+-------+-------+
    

    例4–発生 引数

    occurrenceの使用例を次に示します。 口論。いずれの場合も、位置1から開始します。

    SELECT 
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 1) 'Occurrence 1',
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 2) 'Occurrence 2',
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 3) 'Occurrence 3';

    結果:

    +--------------+--------------+--------------+
    | Occurrence 1 | Occurrence 2 | Occurrence 3 |
    +--------------+--------------+--------------+
    |            1 |            5 |           16 |
    +--------------+--------------+--------------+
    

    ただし、別の位置から開始すると、結果は異なります。

    SELECT 
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2, 1) 'Occurrence 1',
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2, 2) 'Occurrence 2',
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2, 3) 'Occurrence 3';

    結果:

    +--------------+--------------+--------------+
    | Occurrence 1 | Occurrence 2 | Occurrence 3 |
    +--------------+--------------+--------------+
    |            5 |           16 |            0 |
    +--------------+--------------+--------------+
    

    これは、最初の発生が開始された後に開始位置が来たために発生しました。したがって、オカレンス2はオカレンス1になり、オカレンス3はオカレンス2になります。また、オカレンスがなくなったため、オカレンス3の結果は負になりました(つまり、オカレンス3はありませんでした)。

    例5– return_option 引数

    return_optionの使用例を次に示します。 引数:

    SELECT 
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 1, 0) 'Option 0',
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 1, 1) 'Option 1';
    

    結果:

    +----------+----------+
    | Option 0 | Option 1 |
    +----------+----------+
    |        1 |        4 |
    +----------+----------+
    

    オプション0は、一致した部分文字列の最初の文字を返しました。オプション1は、一致した部分文字列に続く位置を返しました。

    前の例に適用すると、次のようになります。

    SELECT 
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 1, 0) 'Occurrence 1',
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 2, 0) 'Occurrence 2',
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 3, 0) 'Occurrence 3'
    UNION ALL
    SELECT
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 1, 1),
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 2, 1),
      REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 3, 1);
    
    

    結果:

    +--------------+--------------+--------------+
    | Occurrence 1 | Occurrence 2 | Occurrence 3 |
    +--------------+--------------+--------------+
    |            1 |            5 |           16 |
    |            4 |            8 |           19 |
    +--------------+--------------+--------------+
    

    この場合、オプション0を使用して1つのセットを実行し、オプション1を使用して別のセットを実行してから、 UNION ALLを使用してそれらを結合しました。 。

    例6– match_type 引数

    一致タイプを決定するための追加の引数を指定できます。これにより、一致で大文字と小文字が区別されるかどうか、行末記号を含めるかどうかなどを指定できます。

    大文字と小文字を区別する一致と大文字と小文字を区別しない一致を指定する例を次に示します。

    SELECT 
      REGEXP_INSTR('Cat City is SO Cute!', 'c.t', 1, 1, 0, 'c') 'Case-Sensitive',
      REGEXP_INSTR('Cat City is SO Cute!', 'c.t', 1, 1, 0, 'i') 'Case-Insensitive';

    結果:

    +----------------+------------------+
    | Case-Sensitive | Case-Insensitive |
    +----------------+------------------+
    |              0 |                1 |
    +----------------+------------------+
    

    match_type 引数には次の文字を含めることができます:

    c
    大文字と小文字を区別するマッチング。
    i
    大文字と小文字を区別しないマッチング。
    m
    複数行モード。文字列内の行末記号を認識します。デフォルトの動作では、文字列式の最初と最後でのみ行末記号が一致します。
    n
    文字はラインターミネータと一致します。デフォルトはです。 行の終わりで停止するためのマッチング。
    u
    Unixのみの行末。 で終わる行として認識されるのは、改行文字のみです。 、 ^ 、および $ 一致演算子。

    1. SQLServerで自動インクリメント主キーを定義する方法

    2. MySQLでGroupBy句を使用して行をグループ化する

    3. ログインで要求されたデータベーステストを開くことができません。ログインに失敗しました。ユーザー'xyz\ASPNET'のログインに失敗しました

    4. ベストマッチによるMySQLの順序