名前 | 説明 |
---|---|
NOT
REGEXP |
REGEXP の否定 |
REGEXP |
正規表現を使用したパターンマッチング |
RLIKE |
REGEXP の同義語 |
正規表現は、複雑な検索でパターンを特定する協力な方法です。
MySQL
はヘンリー・スペンサーの正規表現の実装を使用します。これは、POSIX
1003.2.
との適合性を目指したものです。Creditsを参照してください。MySQL
は、SQL
ステートメントでの、REGEXP
演算子とのパターン照会演算をサポートするため、拡張バージョンを使用します。
この節では、MySQL で
REGEXP
演算に使用される特殊な文字や構文の概要や例を記載します。ヘンリー・スペンサーの
regex(7)
マニュアルページにあるような詳細は網羅していません。このマニュアルページは
MySQL
のソース配布物の、regex
ディレクトリ下の
regex.7
ファイルに含まれています。項1.3.4.7. 「パターンマッチング」
も参照してください。
、expr
NOT REGEXP
pat
expr
NOT RLIKE pat
これは、NOT
(
と同様です。
expr
REGEXP
pat
)
、expr
REGEXP
pat
expr
RLIKE pat
パターン pat
に対して、文字列の式
expr
のパターン照合を行います。このパターンは拡張正規表現にもなりえます。正規表現の構文については、項7.4.2. 「正規表現」
で説明されています。expr
が pat
と一致する場合は
1
を返し、それ以外では
0
を返します。expr
または
pat
のどちらかが
NULL
である場合、結果は
NULL
になります。RLIKE
は、mSQL
との互換性のために用意された、REGEXP
の同義語です。
パターンはリテラル文字列である必要があります。たとえば、文字列式、またはテーブルカラムとして指定するのでもかまいません。
MySQL は C
エスケープ構文を文字列で使用するため
(たとえば、「\n
」
で改行文字を)、REGEXP
文字列で使用する
「\
」
はすべて二重にする必要があります。
REGEXP
は、バイナリ列と使用する場合以外では、大文字小文字の区別をしません。
mysql>SELECT 'Monty!' REGEXP 'm%y%%';
-> 0 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
は、文字の型を決定する際に、現行のキャラクタセットを使用します。デフォルトは
latin1
(cp1252 West
European) です。
REGEXP
および
RLIKE
演算子はバイト単位で機能するためマルチバイトに対して安全ではなく、マルチバイトキャラクタセットで予期しない結果が発生する可能性があります。さらに、これらの演算子ではキャラクタの比較がそのバイト値に基づいて行われるため、アクセント付きキャラクタは、指定された照合では等しいとみなされても、比較時には等しいとみなされない可能性があります。
正規表現は文字列のセットを示します。もっとも簡単な正規表現は、特殊な文字を使用していないものです。たとえば、正規表現
hello
は
hello
のみにマッチします。
重要な正規表現は特定の特殊構文を使用し、1
つ以上の文字列とマッチするようにします。たとえば、正規表現
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
{n}
または
{m,n}
は、パターンの前のアトム (または
「piece」)
の発生の多くにマッチする正規表現の、より一般的な書き方を提供します。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
である (^
が使用されている場合はそれ以外の)
文字とはすべてマッチします。ふたつの文字の間の
-
文字は、最初の文字からふたつめの文字までのすべての文字とマッチする範囲を形成します。たとえば、[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
正規表現の特殊文字のリテラルインスタンスを使用するには、ふたつのバックスラッシュ
(\) 文字を頭につけます。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