正規表現(regex)は、複雑な検索を指定するための有効な方法の 1 つです。
MySQL では、Henry Spencer の正規表現が実装されていますが、その目的は POSIX 1003.2 に適合することです。MySQL では、拡張バージョンが使用されています。
ここでは簡単な説明にとどめ、詳細については省略しています。詳細な情報を入手するには、ソースディストリビューションに含まれている
Henry Spencer の regex(7)
マニュアルページを参照してください。 See
付録 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*
連続する 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
つの整数(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.]]
照合要素の文字シーケンス。シーケンスは、かっこ内のリストに含まれる単一の要素です。かっこ表現に複数文字の照合要素が含まれている場合、2
文字以上にマッチします。たとえば、照合シーケンスに照合要素
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
[[:<:]]
, [[:>:]]
それぞれ単語の始めと終わりの 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
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.