正規表現は,複雑な検索でパタンを指定する強力な方法です。
MySQLではPOSIX 1003.2に準拠することを目的とした亨利·斯宾塞氏による正規表現の実装が使用されます。MySQLでは,SQLステトメントで正则表达式
演算子とともに実行されるパターンマッチング演算をサポートするために,拡張バージョンが使用されています。
このセクションでは,MySQLの正则表达式
演算で使用できる特殊な文字や構造を例を示して要約しています。亨利·斯宾塞氏の正则表达式(7)
マニュアルペジで検索できる詳細がすべて含まれているわけではありません。そのマニュアルペジは,MySQLのソス配布の正则表达式
ディレクトリにあるregex.7
ファ邮箱ルに含まれています。セクション3.3.4.7 "パタンマッチング"も参照してください。
正規表現演算子
これは,
(
と同じです。expr
正则表达式帕特
)パタン
帕特
と比較して,文字列式expr
のパタン一致を実行します。パタンは,拡張正規表現にすることができます。構文については、このセクションの後半で説明します。expr
が帕特
と一致する場合は1
を返し,それ以外の場合は0
を返します。expr
または帕特
のいずれかが零
である場合は,結果も零
になります。RLIKE
は,mSQL
との互換性を確保するために用意された正则表达式
のシノニムです。パタンはリテラル文字列である必要はありません。たとえば,文字列式やテーブルカラムとして指定できます。
注記MySQLでは文字列でCのエスケプ構文(たとえば,改行文字を表すために「
\ n
」)が使用されているため,正则表达式
文字列で使用される「\
」はすべて二重に指定する必要があります。正则表达式
では,バeナリ文字列で使用される場合を除いて,大文字と小文字が区別されません。mysql >选择“蒙蒂!”REGEXP。”*”;- > 1 mysql >选择“新* \ n *线”REGEXP”新\ \ *。\ \ *线”;SELECT 'a' REGEXP 'a', 'a' REGEXP ' BINARY 'a';SELECT 'a' REGEXP '^[a-d]';- > 1
正则表达式
およびRLIKE
では,文字の型を決定する際および比較を実行する際に,引数の文字セットおよび照合順序が使用されます。引数にさまざまな文字セットまたは照合順序が含まれる場合は,セクション10.1.7.5 "式の照合順序"で説明するとおりに,型変換属性ルルが適用されます。警告正则表达式
およびRLIKE
演算子はバイト単位で機能するため,マルチバイトセーフではなく,マルチバイト文字セットを使用すると想定外の結果が生成される可能性があります。さらに,これらの演算子ではそのバイト値に基づいて文字が比較されるため,アクセント記号付き文字は,指定された照合順序では等しいとみなされた場合でも,等しいとして比較されない可能性があります。
正規表現の構文
正規表現では,文字列のセットが記述されます。もっとも単純な正規表現は,特殊文字を使用していないものです。たとえば,正規表現你好
は你好
にのみ一致します。
重要な正規表現では,複数の文字列に一致できるように特定の特殊構造が使用されます。たとえば,正規表現你好|单词
は,文字列你好
または文字列词
に一致します。
さらに複雑な例として,正規表現B[一]* s
は,文字列香蕉
、Baaaaas
、废话
のいずれか,およびB
で始まり,年代
で終わり,その間に任意の数字の一个
またはn
文字が含まれるその他の文字列に一致します。
正则表达式
演算子の正規表現では,次の特殊文字および構造のいずれかが使用される場合があります。
^
文字列の先頭に一致します。
mysql> SELECT 'fo\nfo' REGEXP '^fo$';SELECT ' foo ' REGEXP '^fo';- > 1
$
文字列の末尾に一致します。
mysql> SELECT 'fo\no' REGEXP '^fo\no$';SELECT 'fo\no' REGEXP '^fo$';- > 0
.
任意の文字(復帰改行および改行を含む)に一致します。
SELECT 'fofo' REGEXP '^f.*$';-> 1 mysql> SELECT 'fo\r\nfo' REGEXP '^f.*$';- > 1
一个*
ゼロ個以上の
一个
文字のシケンスに一致します。mysql> SELECT 'Ban' REGEXP '^Ba*n';SELECT 'Baaan' REGEXP '^Ba*n';SELECT 'Bn' REGEXP '^Ba*n';- > 1
+
1個以上の
一个
文字のシケンスに一致します。mysql> SELECT 'Ban' REGEXP '^Ba+n';SELECT 'Bn' REGEXP '^Ba+n';- > 0
一个吗?
ゼロまたは1個の
一个
文字に一致します。SELECT 'Bn' REGEXP '^Ba?n';SELECT 'Ban' REGEXP '^Ba?n';SELECT 'Baan' REGEXP '^Ba?n';- > 0
德|美国广播公司
シケンス
德
または美国广播公司
のいずれかに一致します。mysql> SELECT 'pi' REGEXP 'pi|apa';SELECT 'axe' REGEXP 'pi|apa';SELECT 'apa' REGEXP 'pi|apa';1 mysql> SELECT 'apa' REGEXP '^(pi|apa)$';SELECT 'pi' REGEXP '^(pi|apa)$';SELECT 'pix' REGEXP '^(pi|apa)$';- > 0
(abc) *
シケンス
美国广播公司
のゼロ個以上の邮箱ンスタンスに一致します。SELECT 'pi' REGEXP '^(pi)*$';SELECT 'pip' REGEXP '^(pi)*$';SELECT 'pipi' REGEXP '^(pi)*$';- > 1
{1}
,{2,3}
{n}
または{m, n}
注釈では,パタ,ンの前の原子(または「部分」の数多くの出現に一致する正規表現を記述するより一般的な方法が提供されます。米
およびn
は整数です。一个*
一个{0}
と記述できます。+
{1,}
と記述できます。一个吗?
一个{0,1}
と記述できます。
より厳密に言えば,
{n}
は,一个
の正確にn
個の邮箱ンスタンスに一致します。一个{n}
は,一个
のn
個以上の邮箱ンスタンスに一致します。一个{m, n}
は,一个
の米
個からn
個までの邮箱ンスタンスに一致します。米
およびn
は,0
からRE_DUP_MAX
(デフォルトは255)までの範囲内である必要があります。米
およびn
の両方が指定されている場合は,米
を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
(dx)
,[^ dx)
一个
、b
、c
、d
,またはX
である(^が使用されている場合はそれ以外の)任意の文字に一致します。2 ecommの文字の間の-
1番目の文字から2番目の文字までのすべての文字に一致する範囲が形成されます。たとえば,[0 - 9]
は任意の10進数に一致します。リテラル文字]
を含めるには,左括弧[
の直後に記述する必要があります。リテラル文字-
を含めるには,先頭または末尾に記述する必要があります。[]
ペアの内側に定義された特殊な意味を持たない文字は,それ自体としか一致しません。mysql> SELECT 'aXbc' REGEXP '[a-dXYZ]';SELECT 'aXbc' REGEXP '^[a-dXYZ]$';SELECT 'aXbc' REGEXP '^[a-dXYZ]+$';SELECT 'aXbc' REGEXP '^[^a-dXYZ]+$';- > 0 mysql >选择“gheis”REGEXP”^ (^ a-dXYZ] + $ ';SELECT 'gheisa' REGEXP '^[^a-dXYZ]+$';- > 0
(.characters。)
(
[
と]
を使用して記述された)括弧式内で,その照合要素の文字シ,ケンスに一致します。字符
は,単一の文字または换行符
などの文字名です。次の表には,許可されている文字名を一覧表示します。次の表には,許可されている文字名および一致する文字を表示します。数値として指定された文字では,値が8進数で表記されます。
名前 文字 名前 文字 空
0
全音阶
001
STX
002
ETX
003
测试结束
004
询问
005
消
006
贝尔
007
警报
007
废话
010
退格
“\ b”
HT
011
选项卡
' \ t '
低频
012
换行符
' \ n '
VT
013
垂直制表符
‘\ v’
FF
014
换页
“\ f”
CR
015
回车
' \ r '
所以
016
如果
017
DLE
020
DC1
021
DC2
022
DC3
023
DC4
024
钠钾共晶合金
025
SYN
026
ETB
027
可以
030
新兴市场
031
子
032
ESC
033
IS4
034
FS
034
IS3
035
GS
035
IS2
036
RS
036
IS1
037
我们
037
空间
' '
感叹号
“!”
引号
“””
数字符号
“#”
美元符号
“美元”
百分号
“%”
&
“&”
撇号
”\
左括号
“(”
右括号
“)”
星号
‘*’
加号
“+”
逗号
”、“
连字符
“- - -”
hyphen-minus
“- - -”
期
“。”
用句号
“。”
削减
' / '
固相
' / '
零
' 0 '
一个
' 1 '
两个
' 2 '
三个
“3”
四个
“4”
五个
“5”
六个
“6”
七个
“7”
八个
“8”
九个
“9”
结肠
“:”
分号
“;”
小于号
“<”
等号
“=”
大于号
“>”
问号
“?”
商务
“@”
left-square-bracket
“(”
反斜杠
“\ \”
reverse-solidus
“\ \”
right-square-bracket
“]”
弯曲的
“^”
circumflex-accent
“^”
下划线
“_”
低压线路
“_”
沉音符
’”
左括号
“{”
left-curly-bracket
“{”
垂直线
“|”
右括号
“}”
right-curly-bracket
“}”
波浪号
“~”
▽
177
mysql> SELECT '~' REGEXP '[[.~.]]';-> 1 mysql> SELECT '~' REGEXP '[[.tilde.]]]';- > 1
(= character_class =)
(
[
と]
使用して記述された)括弧式内の(= character_class =)
は,等価クラスを表します。これは,同じ照合順序値を持つすべての文字 (それ自体を含む) に一致します。たとえば、o
および(+)
が等価クラスのメンバである場合,[[= o =]]
、[[= (+) =]]
,および(o (+))
はすべてシノニムです。等価クラスは,範囲の終点として使用できない場合もあります。(character_class:)
(
[
と]
を使用して記述された)括弧式内の(character_class:)
は,そのクラスに属するすべての文字と一致する文字クラスを表します。次の表には,標準のクラス名を一覧表示します。これらの名前は,ctype (3)
のマニュアルペジで定義されている文字クラスを表しています。特定のロケルでは,ほかのクラス名が提供される場合もあります。文字クラスは,範囲の終点として使用できない場合もあります。文字クラス名 意味 alnum
英数文字 α
アルファベット文字 空白
空白文字 cntrl
制御文字 数字
数字文字 图
図形文字 较低的
小文字アルファベット文字 打印
図形または空白文字 punct
句読点文字 空间
空白,タブ,改行,および復帰改行 上
大文字アルファベット文字 xdigit
16 進数文字 mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+';mysql> SELECT '!!'REGEXP的[[:alnum:]] +;- > 0
[[: <:]]
,[[: >:]]
これらのマカは,単語境界を表します。単語の先頭と末尾にそれぞれ一致します。単語とは,前後に単語文字が存在しない単語文字のシケンスです。単語文字とは,
alnum
クラス内の英数文字またはアンダスコア(_
です。mysql >选择“一个词“正则表达式”[[:<:]][[:>:]]”;- > 1 mysql >选择“xword REGEXP的[[:<:]]词[[:>:]]';- > 0
正規表現で特殊文字のリテラルインスタンスを使用するには,前に2つのバックスラッシュ(\)文字を付けます。MySQLパーサーが2つのバックスラッシュの一方を解釈し,正規表現ライブラリがもう一方を解釈します。たとえば,特殊文字+
を含む文字列1 + 2
に一致する正規表現は,次のうで最後のものだけです。
REGEXP '1+2';SELECT '1+2' REGEXP '1\+2';SELECT '1+2' REGEXP '1\\+2';- > 1