正規表現は、複雑な検索でパターンを特定する協力な方法です。
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