[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

G. MySQL の正規表現

正規表現(regex)は、複雑な検索を指定するための有効な方法の 1 つです。

MySQL では、Henry Spencer の正規表現が実装されていますが、その目的は POSIX 1003.2 に適合することです。MySQL では、拡張バージョンが使用されています。

ここでは簡単な説明にとどめ、詳細については省略しています。詳細な情報を入手するには、ソースディストリビューションに含まれている Henry Spencer の regex(7) マニュアルページを参照してください。 「C. 協力者」 節 参照 。

正規表現では、一連の文字列を記述します。最も単純な regexp は、特殊文字を含まない形式です。たとえば、regexp hellohello のみにマッチします。

単純でない形式の正規表現は、特殊な構成要素を含んでおり、複数の文字列にマッチします。たとえば、regexp hello|word は文字列 hello または文字列 word にマッチします。

さらに複雑な例は regexp B[an]*s です。文字列 BananasBaaaaasBs のいずれにもマッチするほか、これら以外で先頭が B、末尾が s になっており、かつ、先頭と末尾の間に a または n が含まれている(文字数は問わない) 文字列のすべてにマッチします。

正規表現では、以下の特殊な文字または構成要素を使用することができます。

^
文字列の先頭にマッチ。
 
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\nfo" REGEXP "^f.*";           -> 1
a*
連続する 0 文字以上の 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?
0 文字または 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 の 0 回以上の繰り返しにマッチ。
 
mysql> SELECT "pi" REGEXP "^(pi)*$";            -> 1
mysql> SELECT "pip" REGEXP "^(pi)*$";           -> 0
mysql> SELECT "pipi" REGEXP "^(pi)*$";          -> 1
{1}
{2,3}
直前のパターンが多数出現する場合、それらにマッチする regexp をさらに一般的な方式で記述することができます。
a*
a{0,} に書き換えることが可能。
a+
a{1,} に書き換えることが可能。
a?
a{0,1} に書き換えることが可能。
より正確に表現すると、パターンの直後のかっこ内に整数 i が 1 つあってカンマがない場合、パターンに適合する i 回のシーケンスにマッチします。パターンの直後のかっこ内に整数 i とカンマが 1 つずつある場合、パターンに適合する i 回以上のシーケンスにマッチします。 パターンの直後のかっこ内に 2 つの整数(ij)がある場合、パターンに適合する ij 回のシーケンスにマッチします。

2 つの引数は、0 から RE_DUP_MAX(デフォルトは 255)までの範囲に含まれている必要があります。引数が 2 つある場合、2 つ目は 1 つ目以上でなければなりません。

[a-dX]
[^a-dX]
abcdX のいずれかに該当する(^ が使用されている場合、これらのいずれにも該当しない)文字にマッチします。] をリテラルとして含めるには、[ の直後に記述する必要があります。- をリテラルとして含めるには、最初または最後に記述する必要があります。したがって、[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.]]
照合要素の文字シーケンス。シーケンスは、かっこ内のリストに含まれる単一の要素です。かっこ表現に複数文字の照合要素が含まれている場合、2 文字以上にマッチします。たとえば、照合シーケンスに照合要素 ch が含まれていると、正規表現 [[.ch.]]*cchchcc の最初の 5 文字にマッチします。

[=character_class=]
等価クラスであり、それ自身を含め、それと等価なすべての照合要素の文字列を意味します。

たとえば、o(+) が等価クラスのメンバである場合、[[=o=]][[=(+)=]][o(+)] はすべて同義語です。等価クラスを範囲の終了位置にすることはできません。

[:character_class:]
かっこ表現において [::] で囲まれた文字クラス名は、そのクラスに属するすべての文字のリストを意味します。標準文字クラス名は以下のとおりです。

名称 名称 名称
alnum digit punct
alpha graph space
blank lower upper
cntrl print xdigit

これらは、ctype(3) マニュアルページで定義された文字クラスを意味します。ロケールにより、他の文字クラスが提供されることもあります。文字クラスを範囲のエンドポイントにすることはできません。
 
mysql> SELECT "justalnums" REGEXP "[[:alnum:]]+";       -> 1
mysql> SELECT "!!" REGEXP "[[:alnum:]]+";               -> 0

[[:<:]]
[[:>:]]
それぞれ単語の始めと終わりの NULL 文字列にマッチします。単語文字シーケンスのうち、前後に別の単語文字が存在しないものが単語と定義されています。単語文字は alnum 文字(ctype(3)で定義)またはアンダースコア(_)です。
 
mysql> SELECT "a word a" REGEXP "[[:<:]]word[[:>:]]";      -> 1
mysql> SELECT "a xword a" REGEXP "[[:<:]]word[[:>:]]";     -> 0

 
mysql> SELECT "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1


[ << ] [ >> ]           [Top ] [Contents ] [Index] [ ? ]

2004年 10月 9日 texi2html にて作成