正規表現は、複雑な検索でパターンを指定する強力な方法です。
MySQL では、POSIX 1003.2
に準拠することを目的とした Henry Spencer
氏による正規表現の実装が使用されます。MySQL
では、SQL ステートメントで
REGEXP
演算子とともに実行されるパターンマッチング演算をサポートするために、拡張バージョンが使用されています。
このセクションでは、MySQL の
REGEXP
演算で使用できる特殊な文字や構造を例を示して要約しています。Henry
Spencer 氏の regex(7)
マニュアルページで検索できる詳細がすべて含まれているわけではありません。そのマニュアルページは、MySQL
のソース配布の regex
ディレクトリにある regex.7
ファイルに含まれています。セクション3.3.4.7「パターンマッチング」も参照してください。
正規表現演算子
-
,expr
NOT REGEXPpat
expr
NOT RLIKEpat
これは、
NOT (
と同じです。expr
REGEXPpat
) -
、expr
REGEXPpat
expr
RLIKEpat
パターン
pat
と比較して、文字列式expr
のパターン一致を実行します。パターンは、拡張正規表現にすることができます。構文については、このセクションの後半で説明します。expr
がpat
と一致する場合は1
を返し、それ以外の場合は0
を返します。expr
またはpat
のいずれかがNULL
である場合は、結果もNULL
になります。RLIKE
は、mSQL
との互換性を確保するために用意されたREGEXP
のシノニムです。パターンはリテラル文字列である必要はありません。たとえば、文字列式やテーブルカラムとして指定できます。
注記MySQL では文字列で C のエスケープ構文 (たとえば、改行文字を表すために 「
\n
」) が使用されているため、REGEXP
文字列で使用される 「\
」 はすべて二重に指定する必要があります。REGEXP
では、バイナリ文字列で使用される場合を除いて、大文字と小文字が区別されません。mysql> SELECT 'Monty!' REGEXP '.*'; -> 1 mysql> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line'; -> 1 mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A'; -> 1 0 mysql> SELECT 'a' REGEXP '^[a-d]'; -> 1
REGEXP
およびRLIKE
では、文字の型を決定する際および比較を実行する際に、引数の文字セットおよび照合順序が使用されます。引数にさまざまな文字セットまたは照合順序が含まれる場合は、セクション10.1.7.5「式の照合順序」で説明するとおりに、型変換属性ルールが適用されます。警告REGEXP
およびRLIKE
演算子はバイト単位で機能するため、マルチバイトセーフではなく、マルチバイト文字セットを使用すると想定外の結果が生成される可能性があります。さらに、これらの演算子ではそのバイト値に基づいて文字が比較されるため、アクセント記号付き文字は、指定された照合順序では等しいとみなされた場合でも、等しいとして比較されない可能性があります。
正規表現の構文
正規表現では、文字列のセットが記述されます。もっとも単純な正規表現は、特殊文字を使用していないものです。たとえば、正規表現
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}
注釈では、パターンの前の原子 (または「部分」) の数多くの出現に一致する正規表現を記述するより一般的な方法が提供されます。m
およびn
は整数です。-
a*
a{0,}
と記述できます。 -
a+
a{1,}
と記述できます。 -
a?
a{0,1}
と記述できます。
より厳密に言えば、
a{n}
は、a
の正確にn
個のインスタンスに一致します。a{n,}
は、a
のn
個以上のインスタンスに一致します。a{m,n}
は、a
のm
個からn
個までのインスタンスに一致します。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
である (^ が使用されている場合はそれ以外の) 任意の文字に一致します。2 つの文字の間の-
文字によって、1 番目の文字から 2 番目の文字までのすべての文字に一致する範囲が形成されます。たとえば、[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
などの文字名です。次の表には、許可されている文字名を一覧表示します。次の表には、許可されている文字名および一致する文字を表示します。数値として指定された文字では、値が 8 進数で表記されます。
名前 文字 名前 文字 NUL
0
SOH
001
STX
002
ETX
003
EOT
004
ENQ
005
ACK
006
BEL
007
alert
007
BS
010
backspace
'\b'
HT
011
tab
'\t'
LF
012
newline
'\n'
VT
013
vertical-tab
'\v'
FF
014
form-feed
'\f'
CR
015
carriage-return
'\r'
SO
016
SI
017
DLE
020
DC1
021
DC2
022
DC3
023
DC4
024
NAK
025
SYN
026
ETB
027
CAN
030
EM
031
SUB
032
ESC
033
IS4
034
FS
034
IS3
035
GS
035
IS2
036
RS
036
IS1
037
US
037
space
' '
exclamation-mark
'!'
quotation-mark
'"'
number-sign
'#'
dollar-sign
'$'
percent-sign
'%'
ampersand
'&'
apostrophe
'\''
left-parenthesis
'('
right-parenthesis
')'
asterisk
'*'
plus-sign
'+'
comma
','
hyphen
'-'
hyphen-minus
'-'
period
'.'
full-stop
'.'
slash
'/'
solidus
'/'
zero
'0'
one
'1'
two
'2'
three
'3'
four
'4'
five
'5'
six
'6'
seven
'7'
eight
'8'
nine
'9'
colon
':'
semicolon
';'
less-than-sign
'<'
equals-sign
'='
greater-than-sign
'>'
question-mark
'?'
commercial-at
'@'
left-square-bracket
'['
backslash
'\\'
reverse-solidus
'\\'
right-square-bracket
']'
circumflex
'^'
circumflex-accent
'^'
underscore
'_'
low-line
'_'
grave-accent
'`'
left-brace
'{'
left-curly-bracket
'{'
vertical-line
'|'
right-brace
'}'
right-curly-bracket
'}'
tilde
'~'
DEL
177
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
正規表現で特殊文字のリテラルインスタンスを使用するには、前に
2 つのバックスラッシュ (\)
文字を付けます。MySQL パーサーが 2
つのバックスラッシュの一方を解釈し、正規表現ライブラリがもう一方を解釈します。たとえば、特殊文字
+
を含む文字列 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