MySQL 5.1 リファレンスマニュアル :: 11 関数と演算子 :: 11.3 文字列関数 :: 11.3.2 正規表現
« 11.3.1 文字列比較関数

11.4 数字関数 »
Section Navigation      [Toggle]
  • 11.3 文字列関数
  • 11.3.1 文字列比較関数
  • 11.3.2 正規表現

11.3.2. 正規表現

正規表現は、複雑な検索でパターンを特定する協力な方法です。

MySQL はヘンリー・スペンサーの正規表現の実装を使用します。これは、POSIX 1003.2. との適合性を目指したものです。付録 E. Credits をご覧ください。MySQL は、SQL 文での、REGEXP 演算子とのパターン照会演算をサポートするため、拡張バージョンを使用します。Pattern Matching および 項11.3.1. 「文字列比較関数」 を参照してください。

このセクションでは、MySQL で REGEXP 演算に使用される特殊な文字や構文の概要や例を記載します。ヘンリー・スペンサーの regex(7) マニュアル ページにあるような詳細は網羅していません。このマニュアル ページは MySQL のソース配布物の、regex ディレクトリ下の regex.7 ファイルに含まれています。

正規表現はストリングのセットを示します。最も簡単な正規表現は、特殊な文字を使用していないものです。例えば、正規表現 hello は hello のみにマッチします。

重要な正規表現は特定の特殊構文を使用し、ひとつ以上のストリングとマッチするようにします。例えば、正規表現 hello|word は、ストリング hello または ストリング word とマッチします。

さらに複雑な例としては、正規表現 B[an]*s は、ストリング Bananas 、Baaaaas 、Bs のいずれとでもマッチし、また、他の B で始まるストリング、s で終わるストリング、ひとつでも a または n 文字を間に含むストリングとも一致します。

REGEXP 演算子の正規表現は、次の特殊文字および構文のいずれかを使用する場合があります :

  • ^

    ストリングの頭にマッチ。

    mysql> SELECT 'fo\nfo' REGEXP '^fo$';                   -> 0
    mysql> SELECT 'fofo' REGEXP '^fo';                      -> 1
    
  • $

    ストリングの最後にマッチ。

    mysql> SELECT 'fo\no' REGEXP '^fo\no$';                 -> 1
    mysql> SELECT 'fo\no' REGEXP '^fo$';                    -> 0
    
  • .

    あらゆる文字とマッチ ( 改行復帰および通常改行を含む ) 。

    mysql> SELECT 'fofo' REGEXP '^f.*$';                    -> 1
    mysql> SELECT 'fo\r\nfo' REGEXP '^f.*$';                -> 1
    
  • a*

    ゼロ以上の a 文字のあらゆるシークエンスにマッチ。

    mysql> SELECT 'Ban' REGEXP '^Ba*n';                     -> 1
    mysql> SELECT 'Baaan' REGEXP '^Ba*n';                   -> 1
    mysql> SELECT 'Bn' REGEXP '^Ba*n';                      -> 1
    
  • a+

    1 以上の a 文字のあらゆるシークエンスにマッチ。

    mysql> SELECT 'Ban' REGEXP '^Ba+n';                     -> 1
    mysql> SELECT 'Bn' REGEXP '^Ba+n';                      -> 0
    
  • a?

    ゼロ、または 1 以上の a 文字とマッチ。

    mysql> SELECT 'Bn' REGEXP '^Ba?n';                      -> 1
    mysql> SELECT 'Ban' REGEXP '^Ba?n';                     -> 1
    mysql> SELECT 'Baan' REGEXP '^Ba?n';                    -> 0
    
  • de|abc

    シークエンス de または abc のどちらかをマッチ。

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

    シークエンス abc のゼロ以上のインスタンスをマッチ。

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

    {n} または {m,n} 表記は、パターンの前のアトム ( または 「piece」 ) の発生の多くにマッチする正規表現の、より一般的な書き方を提供します。m および n は整数です。

    • a*

      a{0,} として書くことができます.

    • a+

      a{1,} として書くことができます.

    • a?

      a{0,1} として書くことができます.

    より正確を期するため、a{n} は a の n インスタンスに完全にマッチします。a{n,} は n か、a のより多くのインスタンスにマッチします。a{m,n} は a の n インスタンスを介して m に包括的にマッチします。

    m および n は、0 から RE_DUP_MAX ( デフォルトは 255 ) の範囲に包括的に含まれなければなりません。m および n の両方が与えられてる場合は、m は、n と均等か、それより少なくなければなりません。

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

    a 、b 、c 、d 、または X である ( ^ が使用されている場合はそれ以外の ) 文字とはすべてマッチします。ふたつの文字の間の - 文字は、最初の文字からふたつ目の文字までのすべての文字とマッチする範囲を形成します。例えば、[0-9] はすべての 10 進数とマッチします。リテラル ] 文字を含むには、左大括弧 [ のすぐ後に続ける必要があるます。リテラル - 文字を含むには、最初または最後に書き込んでください。[] 組の内側の、定義された特殊な意味を持たない文字はすべて、それ自体としかマッチしません。

    mysql> SELECT 'aXbc' REGEXP '[a-dXYZ]';                 -> 1
    mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]$';               -> 0
    mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]+$';              -> 1
    mysql> SELECT 'aXbc' REGEXP '^[^a-dXYZ]+$';             -> 0
    mysql> SELECT 'gheis' REGEXP '^[^a-dXYZ]+$';            -> 1
    mysql> SELECT 'gheisa' REGEXP '^[^a-dXYZ]+$';           -> 0
    
  • [.characters.]

    括弧式 ( [ と ] で書かれたもの ) に囲まれた中で、照合要素である文字のシークエンスをマッチします。characters は単一の文字、または newline のような文字の名称です。文字の名称の完全なリストは、regexp/cname.h ファイルに含まれています。

    mysql> SELECT '~' REGEXP '[[.~.]]';                     -> 1
    mysql> SELECT '~' REGEXP '[[.tilde.]]';                 -> 1
    
  • [=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 'justalnums' REGEXP '[[:alnum:]]+';       -> 1
    mysql> SELECT '!!' REGEXP '[[:alnum:]]+';               -> 0
    
  • [[:<:]], [[:>:]]

    これらのマーカは語境界を参考にしています。これらは語の最初と最後それぞれにマッチします。単語とはその前後に別の単語文字が存在しない、単語文字のシーケンスと定義されています。 単語文字とは、alnum クラス、またはアンダースコア ( _ ) での英数文字のことです。

    mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';   -> 1
    mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';  -> 0
    

正規表現の特殊文字のリテラル インスタンスを使用するには、ふたつのバックスラッシュ ( \ ) 文字を頭につけます。MySQL パーサはふたつのバックスラッシュのうちのひとつを解釈し、正規表現ライブラリがもう一方を解釈します。例えば、特殊 + 文字を含むストリング 1+2 とマッチするには、以下の正規表現のうち、最後のものだけが正解になります :

mysql> SELECT '1+2' REGEXP '1+2';                       -> 0
mysql> SELECT '1+2' REGEXP '1\+2';                      -> 0
mysql> SELECT '1+2' REGEXP '1\\+2';                     -> 1
Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates