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

MariaDBでのREGEXPのしくみ

    MariaDBでは、 REGEXP 演算子は、文字列が正規表現に一致するかどうかを判断するために使用されます。

    文字列が指定された正規表現と一致する場合、結果は 1になります。 、それ以外の場合は 0

    構文

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

    expr REGEXP pat

    expr 入力文字列であり、 pat 文字列をテストする正規表現です。

    以下は、 REGEXPの使用例です。 異なるパターンの演算子。

    基本的な正規表現

    最も簡単な例から始めましょう。使用できる最も単純な正規表現は、特殊文字を含まないものです。ここでは、文字列を使用します。入力文字列のいずれかの部分がその文字列と一致する場合、一致を返します。

    SELECT 
      'Corn' REGEXP 'Corn' AS "Corn",
      'Acorn' REGEXP 'Corn' AS "Acorn",
      'Corner' REGEXP 'Corn' AS "Corner",
      'Cheese' REGEXP 'Corn' AS "Cheese";

    結果:

    +------+-------+--------+--------+
    | Corn | Acorn | Corner | Cheese |
    +------+-------+--------+--------+
    |    1 |     1 |      1 |      0 |
    +------+-------+--------+--------+
    

    文字列の先頭に一致

    この例では、正規表現は、文字列が Coで始まる必要があることを指定しています。 。

    SELECT 
      'Corn' REGEXP '^Co' AS "Corn",
      'Acorn' REGEXP '^Co' AS "Acorn",
      'Cheese' REGEXP '^Co' AS "Cheese";

    結果:

    +------+-------+--------+
    | Corn | Acorn | Cheese |
    +------+-------+--------+
    |    1 |     0 |      0 |
    +------+-------+--------+
    

    文字列の終わりに一致

    この例では、正規表現は、文字列が rnで終わる必要があることを指定しています。 。

    SELECT 
      'Corn' REGEXP 'rn$' AS "Corn",
      'Acorn' REGEXP 'rn$' AS "Acorn",
      'Cheese' REGEXP 'rn$' AS "Cheese";

    結果:

    +------+-------+--------+
    | Corn | Acorn | Cheese |
    +------+-------+--------+
    |    1 |     1 |      0 |
    +------+-------+--------+
    

    任意の文字に一致

    文字はどの文字とも一致します。

    SELECT 
      'Corn' REGEXP '.' AS "Corn",
      'Cheese' REGEXP '.' AS "Cheese",
      '' REGEXP '.' AS "";

    結果:

    +------+--------+---+
    | Corn | Cheese |   |
    +------+--------+---+
    |    1 |      1 | 0 |
    +------+--------+---+
    

    この文字は通常、他の文字と組み合わせて使用​​され、さらに基準を指定します。例:

    SELECT 
      'Corn' REGEXP '^C.rn$' AS "Corn", 
      'Crn' REGEXP '^C.rn$' AS "Crn";

    結果:

    +------+-----+
    | Corn | Crn |
    +------+-----+
    |    1 |   0 |
    +------+-----+
    

    ここでは、文字列が Cで始まる必要があることを指定します 、その後に文字(任意の文字)が続く必要があり、 rnで終わる必要があること 。

    この文字は、文字の単一のインスタンスを指定することに注意してください。複数のインスタンスを指定する場合(たとえば、 ee eだけでなく )、さらにを追加する必要があります。 文字。

    SELECT 
      'Tweet' REGEXP '^Tw..t$' AS "Tweet", 
      'Tweat' REGEXP '^Tw..t$' AS "Tweat", 
      'Tweet' REGEXP '^Tw.t$' AS "Tweet", 
      'Twit' REGEXP '^Tw..t$' AS "Twit";

    結果:

    +-------+-------+-------+------+
    | Tweet | Tweat | Tweet | Twit |
    +-------+-------+-------+------+
    |     1 |     1 |     0 |    0 |
    +-------+-------+-------+------+
    

    これを行う別の方法は、中括弧内に出現回数を指定することです。

    SELECT 
      'Tweet' REGEXP '^Tw.{2}t$' AS "Tweet", 
      'Tweat' REGEXP '^Tw.{2}t$' AS "Tweat", 
      'Tweet' REGEXP '^Tw.{1}t$' AS "Tweet", 
      'Twit' REGEXP '^Tw.{2}t$' AS "Twit";

    結果:

    +-------+-------+-------+------+
    | Tweet | Tweat | Tweet | Twit |
    +-------+-------+-------+------+
    |     1 |     1 |     0 |    0 |
    +-------+-------+-------+------+
    

    ただし、探している文字がわかっている場合は、(の代わりに、その文字を指定できます。 次の例に示すように、文字)。

    特定の文字のゼロ個以上のインスタンスを一致させる

    e の0個以上のインスタンスを指定するには、次のようにします。 キャラクター:

    SELECT 
      'Twet' REGEXP '^Twe*t$' AS "Twet",
      'Tweet' REGEXP '^Twe*t$' AS "Tweet",
      'Tweeet' REGEXP '^Twe*t$' AS "Tweeet",
      'Twt' REGEXP '^Twe*t$' AS "Twt",
      'Twit' REGEXP '^Twe*t$' AS "Twit",
      'Twiet' REGEXP '^Twe*t$' AS "Twiet",
      'Tweit' REGEXP '^Twe*t$' AS "Tweit";

    結果:

    +------+-------+--------+-----+------+-------+-------+
    | Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit |
    +------+-------+--------+-----+------+-------+-------+
    |    1 |     1 |      1 |   1 |    0 |     0 |     0 |
    +------+-------+--------+-----+------+-------+-------+
    

    最初の4つは一致しますが、最後の3つは一致しません。

    特定の文字の1つ以上のインスタンスを一致させる

    前の例を変更して、1つの場合にのみ一致するようにすることができます。 以上の文字が見つかりました(前の例では、ゼロの場合に一致が返されました 以上が見つかりました)。これを行うには、単に +を使用します *の代わりに :

    SELECT 
      'Twet' REGEXP '^Twe+t$' AS "Twet",
      'Tweet' REGEXP '^Twe+t$' AS "Tweet",
      'Tweeet' REGEXP '^Twe+t$' AS "Tweeet",
      'Twt' REGEXP '^Twe+t$' AS "Twt",
      'Twit' REGEXP '^Twe+t$' AS "Twit",
      'Twiet' REGEXP '^Twe+t$' AS "Twiet",
      'Tweit' REGEXP '^Twe+t$' AS "Tweit";

    結果:

    +------+-------+--------+-----+------+-------+-------+
    | Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit |
    +------+-------+--------+-----+------+-------+-------+
    |    1 |     1 |      1 |   0 |    0 |     0 |     0 |
    +------+-------+--------+-----+------+-------+-------+
    

    この場合、4番目の単語は前の例とは異なる結果を返します。

    特定の文字のゼロまたは1つのインスタンスに一致

    前の例を変更して、0個または目的の文字の1つにのみ一致するようにすることができます。これを行うには、を使用します :

    SELECT 
      'Twet' REGEXP '^Twe?t$' AS "Twet",
      'Tweet' REGEXP '^Twe?t$' AS "Tweet",
      'Tweeet' REGEXP '^Twe?t$' AS "Tweeet",
      'Twt' REGEXP '^Twe?t$' AS "Twt",
      'Twit' REGEXP '^Twe?t$' AS "Twit",
      'Twiet' REGEXP '^Twe?t$' AS "Twiet",
      'Tweit' REGEXP '^Twe?t$' AS "Tweit";

    結果:

    +------+-------+--------+-----+------+-------+-------+
    | Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit |
    +------+-------+--------+-----+------+-------+-------+
    |    1 |     0 |      0 |   1 |    0 |     0 |     0 |
    +------+-------+--------+-----+------+-------+-------+
    

    代替

    |を使用できます 1つまたは別の文字シーケンスに一致する文字:

    SELECT 
      'Tweet' REGEXP 'Tw|et' AS "Tweet",
      'For Let' REGEXP 'Tw|et' AS "For Let",
      'Banana' REGEXP 'Tw|et' AS "Banana";

    結果:

    +-------+---------+--------+
    | Tweet | For Let | Banana |
    +-------+---------+--------+
    |     1 |       1 |      0 |
    +-------+---------+--------+
    

    単語全体を検索する別の例を次に示します。

    SELECT 
      'Cat' REGEXP 'Cat|Dog' AS "Cat",
      'Dog' REGEXP 'Cat|Dog' AS "Dog",
      'Doggone' REGEXP 'Cat|Dog' AS "Doggone",
      'Banana' REGEXP 'Cat|Dog' AS "Banana";

    結果:

    +-----+-----+---------+--------+
    | Cat | Dog | Doggone | Banana |
    +-----+-----+---------+--------+
    |   1 |   1 |       1 |      0 |
    +-----+-----+---------+--------+
    

    正規表現が文字列の一部にのみ一致する場合でも、一致は得られます。

    シーケンスのゼロ個以上のインスタンスを一致させる

    アスタリスク()*と一緒に角かっこを使用できます シーケンスの0個以上のインスタンスを指定するには:

    SELECT 
      'Banana' REGEXP '(an)*' AS "Banana",
      'Land' REGEXP '(an)*' AS "Land",
      'Cheese' REGEXP '(an)*' AS "Cheese";

    結果:

    +--------+------+--------+
    | Banana | Land | Cheese |
    +--------+------+--------+
    |      1 |    1 |      1 |
    +--------+------+--------+
    

    別の例:

    SELECT 
      'Banana' REGEXP '^B(an)*d$' AS "Banana",
      'Band' REGEXP '^B(an)*d$' AS "Band",
      'Bald' REGEXP '^B(an)*d$' AS "Bald",
      'Bad' REGEXP '^B(an)*d$' AS "Bad";

    結果:

    +--------+------+------+-----+
    | Banana | Band | Bald | Bad |
    +--------+------+------+-----+
    |      0 |    1 |    0 |   0 |
    +--------+------+------+-----+
    

    繰り返し

    前の例で見たように、中括弧を使用して繰り返しを指定できます。この表記は、前の例のいくつかよりも正規表現を書くためのより一般的な方法を提供します。

    SELECT 
      'Tweeet' REGEXP 'e{3}' AS "Tweeet",
      'Tweet' REGEXP 'e{3}' AS "Tweet";

    結果:

    +--------+-------+
    | Tweeet | Tweet |
    +--------+-------+
    |      1 |     0 |
    +--------+-------+
    

    範囲

    ハイフン文字を使用して範囲を指定できます。数値の範囲を指定する例を次に示します。

    SELECT 
      'Tweet 123' REGEXP '[0-9]' AS "Tweet 123",
      'Tweet ABC' REGEXP '[0-9]' AS "Tweet ABC";

    結果:

    +--------+-------+
    | Tweeet | Tweet |
    +--------+-------+
    |      1 |     0 |
    +--------+-------+
    

    次の例では、文字の範囲を指定しています。

    SELECT 
      'Tweet 123' REGEXP '[A-Z]' AS "Tweet 123",
      'ABC' REGEXP '[A-Z]' AS "ABC",
      '123' REGEXP '[A-Z]' AS "123";

    結果:

    +-----------+-----+-----+
    | Tweet 123 | ABC | 123 |
    +-----------+-----+-----+
    |         1 |   1 |   0 |
    +-----------+-----+-----+

    数値の範囲を制限すると、次のようになります。

    SELECT 
      '123' REGEXP '[1-3]' AS "123",
      '012' REGEXP '[1-3]' AS "012",
      '045' REGEXP '[1-3]' AS "045";

    結果:

    +-----+-----+-----+
    | 123 | 012 | 045 |
    +-----+-----+-----+
    |   1 |   1 |   0 |
    +-----+-----+-----+
    

    範囲内ではありません

    ^を使用できます 指定した範囲の文字が除外されるように前の例を変更する文字:

    SELECT 
      '123' REGEXP '[^1-3]' AS "123",
      '012' REGEXP '[^1-3]' AS "012",
      '045' REGEXP '[^1-3]' AS "045";

    結果:

    +-----+-----+-----+
    | 123 | 012 | 045 |
    +-----+-----+-----+
    |   0 |   1 |   1 |
    +-----+-----+-----+
    

    この場合、前の例とは逆の結果が得られます。

    ヌル値

    式またはパターンのいずれかがnullの場合 、結果は nullです :

    SELECT 
      null REGEXP 'Corn' AS "Corn",
      'Acorn' REGEXP null AS "Acorn",
      null REGEXP null AS "Corner";

    結果:

    +------+-------+--------+
    | Corn | Acorn | Corner |
    +------+-------+--------+
    | NULL |  NULL |   NULL |
    +------+-------+--------+

    1. 生成された列をSQLiteのテーブルに追加する

    2. 列SQLを動的に作成する

    3. Oracleのnullと空の文字列

    4. 例を使用してSQLSELECTの使用方法を学ぶ