| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
正規表現(regex)は、複雑な検索を指定するための有効な方法の 1 つです。
MySQL では、Henry Spencer の正規表現が実装されていますが、その目的は POSIX 1003.2 に適合することです。MySQL では、拡張バージョンが使用されています。
ここでは簡単な説明にとどめ、詳細については省略しています。詳細な情報を入手するには、ソースディストリビューションに含まれている Henry Spencer の regex(7) マニュアルページを参照してください。 「C. 協力者」 節 参照 。
正規表現では、一連の文字列を記述します。最も単純な regexp は、特殊文字を含まない形式です。たとえば、regexp hello は hello のみにマッチします。
単純でない形式の正規表現は、特殊な構成要素を含んでおり、複数の文字列にマッチします。たとえば、regexp hello|word は文字列 hello または文字列 word にマッチします。
さらに複雑な例は regexp B[an]*s です。文字列 Bananas、Baaaaas、Bs のいずれにもマッチするほか、これら以外で先頭が 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*
a にマッチ。
mysql> SELECT "Ban" REGEXP "^Ba*n"; -> 1 mysql> SELECT "Baaan" REGEXP "^Ba*n"; -> 1 mysql> SELECT "Bn" REGEXP "^Ba*n"; -> 1 |
a+
a にマッチ。
mysql> SELECT "Ban" REGEXP "^Ba+n"; -> 1 mysql> SELECT "Bn" REGEXP "^Ba+n"; -> 0 |
a?
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}
a*
a{0,} に書き換えることが可能。
a+
a{1,} に書き換えることが可能。
a?
a{0,1} に書き換えることが可能。
i が 1 つあってカンマがない場合、パターンに適合する i 回のシーケンスにマッチします。パターンの直後のかっこ内に整数 i とカンマが 1 つずつある場合、パターンに適合する i 回以上のシーケンスにマッチします。
パターンの直後のかっこ内に 2 つの整数(i と j)がある場合、パターンに適合する i 〜 j 回のシーケンスにマッチします。
2 つの引数は、0 から RE_DUP_MAX(デフォルトは 255)までの範囲に含まれている必要があります。引数が 2 つある場合、2 つ目は 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.]]
ch が含まれていると、正規表現 [[.ch.]]*c は chchcc の最初の 5 文字にマッチします。
[=character_class=]
たとえば、o と (+) が等価クラスのメンバである場合、[[=o=]]、[[=(+)=]]、[o(+)] はすべて同義語です。等価クラスを範囲の終了位置にすることはできません。
[:character_class:]
[: と :] で囲まれた文字クラス名は、そのクラスに属するすべての文字のリストを意味します。標準文字クラス名は以下のとおりです。
| 名称 | 名称 | 名称 |
| alnum | digit | punct |
| alpha | graph | space |
| blank | lower | upper |
| cntrl | xdigit |
これらは、ctype(3) マニュアルページで定義された文字クラスを意味します。ロケールにより、他の文字クラスが提供されることもあります。文字クラスを範囲のエンドポイントにすることはできません。
mysql> SELECT "justalnums" REGEXP "[[:alnum:]]+"; -> 1 mysql> SELECT "!!" REGEXP "[[:alnum:]]+"; -> 0 |
[[:<:]]
[[:>:]]
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] | [ ? ] |