正则表达式是为复杂搜索指定模式的一种强大方法。本节讨论正则表达式匹配可用的操作符,并通过示例说明一些可用于正则表达式操作的特殊字符和结构。另请参阅第3.3.4.7节“模式匹配”。
MySQL使用Henry Spencer的正则表达式实现,目的是符合POSIX 1003.2。MySQL使用扩展版本来支持SQL语句中的正则表达式模式匹配操作。这一节并不包含在亨利·斯宾塞的书中可以找到的所有细节RegEx(7)
手动页面。该手册页包含在MySQL源分布中regex.7
文件下的文件正则表达式
目录。
这与
不是 (
。expr.
regexp.帕特
)如果字符串返回1
expr.
匹配模式指定的正则表达式帕特
,否则为0。如果任何一expr.
或者帕特
是空值
,返回值是空值
。模式可以是扩展的正则表达式,讨论的语法正则表达式语法。模式不需要是字面值字符串。例如,它可以指定为字符串表达式或表列。
请注意MySQL在字符串中使用C转义语法(例如,
\ n
表示换行符)。如果你想要expr.
或者帕特
包含文字的论点\
,你必须加倍。(除非这是no_backslash_escapes.
SQL模式已启用,在这种情况下,不使用转义字符。)在决定字符类型并执行比较时,正则表达式操作使用字符串表达式和模式参数的字符集和缩合。如果参数具有不同的字符集或归类,则胁迫规则适用如上所述第10.8.4节,“表达式中的排序强制性”。如果任一参数是二进制字符串,则参数以区分大小写的方式处理为二进制字符串。
mysql>选择'michael!'regexp'。*';+ ---------------------- + |'迈克尔!'regexp'。*'|+ ---------------------- + |1 |+ ---------------------- + MySQL>选择'新* \ n *行'regexp'new \\ *。\\ * line';+ ---------------------------------- + |'新* \ n *行'regexp'new \\ *。\\ * line'| +---------------------------------------+ | 0 | +---------------------------------------+ mysql> SELECT 'a' REGEXP '^[a-d]'; +---------------------+ | 'a' REGEXP '^[a-d]' | +---------------------+ | 1 | +---------------------+ mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A'; +----------------+-----------------------+ | 'a' REGEXP 'A' | 'a' REGEXP BINARY 'A' | +----------------+-----------------------+ | 1 | 0 | +----------------+-----------------------+
正则表达式描述了一组字符串。最简单的正则表达式是其中没有特殊字符的正则表达式。例如,正则表达式你好
火柴你好
而不是别的。
非普通正则表达式使用特定的结构,以便它们可以匹配多个字符串。例如,正则表达式你好|世界
包含|
,并匹配你好
或者世界
。
作为一个更复杂的例子,正则表达式B [AN] * s
匹配任何字符串香蕉
,Baaaaas.
,废话
以及以a开头的任何其他字符串B
,结束了年代
,并包含任何数量的一个
或者n
之间的人物。
的正则表达式regexp.
操作员可以使用以下任何特殊字符和构造:
^
匹配字符串的开头。
mysql> SELECT 'fo\nfo' REGEXP '^fo$';-> 0 mysql> SELECT 'fofo' REGEXP '^fo';- > 1
美元
匹配字符串的末尾。
mysql>选择'fo \ no'regexp'^ fo \ no $';- > 1 mysql>选择'fo \ no'regexp'^ fo $';- > 0
。
匹配任何字符(包括回车返回和换行符)。
mysql> SELECT ` fofo ` REGEXP ` ^f.*$ `;-> 1 mysql> SELECT 'fo\r\nfo' REGEXP '^f.*$';- > 1
一种*
匹配任何零个或多个序列
一个
人物。mysql>选择'禁止'regexp'^ ba * n';- > 1 mysql>选择'baaan'regexp'^ ba * n';- > 1 mysql>选择'bn'regexp'^ ba * n';- > 1
A +
匹配一个或多个序列
一个
人物。mysql> SELECT 'Ban' REGEXP '^Ba+n';-> 1 mysql> SELECT 'Bn' REGEXP '^Ba+n';- > 0
一种?
匹配零或一个
一个
的性格。mysql>选择'bn'regexp'^ ba?n';- > 1 mysql>选择'禁止'regexp'^ ba?n';- > 1 mysql>选择'baan'regexp'^ ba?n';- > 0
DE | ABC.
变更申请表;匹配任意一个序列
德
或者美国广播公司
。mysql>选择'pi'regexp'pi | apa';- > 1 mysql>选择'ax'regexp'pi | apa';- > 0 mysql>选择'apa'regexp'pi | apa';- > 1 mysql>选择'apa'regexp'^(pi | apa)$';- > 1 mysql>选择'pi'regexp'^(pi | apa)$';- > 1 mysql>选择'pix'regexp'^(pi | apa)$';- > 0
(abc) *
匹配零序列的零个或多个实例
美国广播公司
。mysql> SELECT 'pi' REGEXP '^(pi)*$';-> 1 mysql> SELECT 'pip' REGEXP '^(pi)*$';-> 0 mysql> SELECT 'pipi' REGEXP '^(pi)*$';- > 1
{1}
,{2,3}
重复;
{
和n
}{
符号提供了一种更通用的编写正则表达式的方式,可以匹配前面多次出现的原子(或”一块”)的模式。米
,n
}米
和n
都是整数。一种*
可以写成
一个{0,}
。A +
可以写成
一个{1,}
。一种?
可以写成
一个{0,1}
。
更准确地说,
一个{
完全匹配n
}n
的实例一个
。一个{
火柴n
}n
或更多的实例一个
。一个{
火柴米
,n
}米
通过n
的实例一个
, 包括的。如果两者米
和n
给出,米
必须小于或等于n
。米
和n
必须在范围内0
至re_dup_max.
255(默认)、包容。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]
匹配任何符合(或不符合)的字符
^
是使用)一个
,b
,c
,d
或者X
。一个-
另外两个字符之间的字符形成与第一个字符与第二个字符的所有字符匹配的范围。例如,[0-9]
匹配任何十进制数字。包含一个文字]
字符,它必须立即跟随左括号(
。包含一个文字-
性格,它必须先写写。任何在a内没有定义的特殊含义的字符[]
对仅匹配自己。mysql>选择'axbc'regexp'[a-dxyz]';- > 1 mysql>选择'axbc'regexp'^ [a-dxyz] $';- > 0 mysql>选择'axbc'regexp'^ [a-dxyz] + $';- > 1 mysql>选择'axbc'regexp'^ [^ a-dxyz] + $';- > 0 mysql>选择'gheis'regexp'^ [^ a-dxyz] + $';- > 1 mysql>选择'gheisa'regexp'^ [^ a-dxyz] + $';- > 0
[。人物。]
在括号表达式中(使用写作
(
和]
),匹配该排序元素的字符序列。字符
是一个字符或字符名称新队
。下表列出了允许的字符名称。下表显示了允许的字符名称和它们匹配的字符。对于以数值形式给出的字符,值用八进制表示。
名称 特点 名称 特点 NUL.
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.
SI.
017.
DLE
020
DC1.
021.
DC2.
022.
DC3.
023.
DC4.
024.
钠钾共晶合金
025.
syn
026.
etb.
027.
能够
030.
新兴市场
031.
亚
032.
退出
033.
IS4
034.
FS
034.
IS3
035.
GS
035.
IS2
036.
卢比
036.
IS1
037.
我们
037.
空间
''
感叹号
'!'
引号
'“'
数字符号
'#'
美元符号
'$'
百分号
'%'
&
'&'
撇号
”\
左括号
'('
右括号
')'
星号
'*'
加号
'+'
逗号
','
hy
“- - -”
hy hy减去
“- - -”
期
“。”
全站星
“。”
削减
' / '
固相
' / '
零
' 0 '
一
' 1 '
二
' 2 '
三
“3”
四个
“4”
五
“5”
六个
“6”
七
“7”
八
'8'
九个
'9'
冒号
':'
分号
';'
小于号
'<'
等于标志
'='
大于签名
'>'
问号
'?'
商业at.
'@'
left-square-bracket
'['
反斜杠
'\\'
反向固定
'\\'
右平方括号
']'
环形
'^'
Conceplylex重点
'^'
下划线
'_'
低线
'_'
沉音符
'''
左括号
'{'
左卷括号
'{'
垂直线
'|'
右支架
'}'
right-curly-bracket
'}'
折叠
'〜'
del
177.
mysql>选择'〜'regexp'[[。〜。]';- > 1 mysql>选择'〜'regexp'[[.tilde。]'';- > 1
(= character_class =)
在括号表达式中(使用写作
(
和]
),(= character_class =)
代表一个等价类。它与具有相同的排序规则值的所有字符匹配,包括本身。例如,如果o
和(+)
是等同类的成员,[[= o =]]
,[[= (+) =]]
, 和[o(+)]
都是同义的。等效类不能用作范围的端点。(character_class:)
在括号表达式中(使用写作
(
和]
),(character_class:)
表示与属于该类的所有字符匹配的字符类。下表列出了标准类名。这些名称代表了所定义的字符类ctype (3)
手动页面。特定区域设置可以提供其他类名。字符类可能不会被用作范围的终点。字符类名 意义 alnum.
字母数字字符 α
字母字符 空白
空格字符 cntrl
控制字符 数字
数字字符 图
图形字符 较低的
小写字母字符 打印
图形或空间字符 标准
标点符号 空间
空格、制表符、换行符和回车符 上
大写字母字符 XDIGIT.
十六进制字符 mysql>选择'justalnums'regexp'[[:Alnum:]] +';- > 1 mysql>选择'!!'Regexp'[[:Alnum:]] +';- > 0
[[:<:]]
,[[: >:]]
这些标志代表了单词边界。它们分别与单词的开头和结尾匹配。单词是一系列单词字符,其未在Word字符之外或之后。一个单词字符是一个字母数字字符
alnum.
课程或下划线(_
)。mysql >选择“一个词“正则表达式”[[:<:]][[:>:]]”;- > 1 mysql >选择“xword REGEXP的[[:<:]]词[[:>:]]';- > 0
要在正则表达式中使用特殊字符的文字实例,请在两个反斜杠(\)字符之前。MySQL解析器解释一个反斜杠,正则表达式库解释另一个。例如,匹配字符串1 + 2
包含特殊的+
字符,只有下面的正则表达式的最后一个是正确的:
MySQL>选择'1 + 2'Regexp'1 + 2';- > 0 mysql>选择'1 + 2'regexp'1 \ +2';- > 0 mysql>选择'1 + 2'Regexp'1 \\ + 2';- > 1