正则表达式是一种为复杂搜索指定模式的强大方法。本节讨论可用于正则表达式匹配的运算符,并通过示例说明一些可用于正则表达式运算的特殊字符和结构。另见
第 3.3.4.7 节,“模式匹配”
。
MySQL 使用 Henry Spencer 的正则表达式实现,旨在与 POSIX 1003.2 保持一致。MySQL 使用扩展版本支持 SQL 语句中的正则表达式模式匹配操作。本节不包含可以在 Henry Spencer 的
regex(7)
手册页中找到的所有详细信息。该手册页包含在 MySQL 源代码分发中,在
目录
regex.7
下的
文件中
regex
。
在确定字符类型和执行比较时,正则表达式操作使用字符串表达式和模式参数的字符集和排序规则。如果参数具有不同的字符集或排序规则,则适用强制性规则,如
第 10.8.4 节,“表达式中的排序规则强制性”中
所述。如果任一参数是二进制字符串,则这些参数将以区分大小写的方式作为二进制字符串进行处理。
mysql> SELECT 'Michael!' REGEXP '.*';
+------------------------+
| 'Michael!' REGEXP '.*' |
+------------------------+
| 1 |
+------------------------+
mysql> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';
+---------------------------------------+
| 'new*\n*line' REGEXP 'new\\*.\\*line' |
+---------------------------------------+
| 0 |
+---------------------------------------+
mysql> SELECT 'a' REGEXP '^[a-d]';
+---------------------+
| 'a' REGEXP '^[a-d]' |
+---------------------+
| 1 |
+---------------------+
REGEXP
and
以
RLIKE
字节方式工作,因此它们不是多字节安全的,并且可能会在多字节字符集上产生意外结果。此外,这些运算符通过字符的字节值和重音字符比较字符可能不相等,即使给定的排序规则将它们视为相等。
匹配字符串的开头。
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
字符的任意序列。
mysql> SELECT 'Ban' REGEXP '^Ba*n'; -> 1
mysql> SELECT 'Baaan' REGEXP '^Ba*n'; -> 1
mysql> SELECT 'Bn' REGEXP '^Ba*n'; -> 1
匹配一个或多个
a
字符的任意序列。
mysql> SELECT 'Ban' REGEXP '^Ba+n'; -> 1
mysql> SELECT 'Bn' REGEXP '^Ba+n'; -> 0
匹配零个或一个
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{0,}
.
可以写成
a{1,}
.
可以写成
a{0,1}
.
更准确地说,
的匹配项或多个实例
, 包含的实例进行
匹配。如果同时
,则必须小于或等于
a{
n
}
n
a
a{
n
,}
n
a
a{
m
,
n
}
m
n
a
m
n
m
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]
匹配任何字符(或不是,如果
^
使用)
a
,
b
,
c
,
d
或
X
.
-
两个其他字符之间的字符形成一个范围,该范围匹配从第一个字符到第二个字符的所有字符。
[0-9]
匹配任何十进制数字。要包含文字
]
字符,它必须紧跟在左括号之后
[
。要包含文字
-
字符,它必须写在最前面或最后。任何在字符中没有定义的特殊含义的字符
[]
pair 只匹配它自己。
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.]
在括号表达式(使用
[
and编写
]
)中,匹配该整理元素的字符序列。
characters
是单个字符或字符名称,如
newline
. 下表列出了允许的字符名称。
下表显示了允许的字符名称及其匹配的字符。对于以数值形式给出的字符,这些值以八进制表示。
alert
backspace
newline
vertical-tab
form-feed
carriage-return
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
three
seven
eight
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
mysql> SELECT '~' REGEXP '[[.~.]]'; -> 1
mysql> SELECT '~' REGEXP '[[.tilde.]]'; -> 1
[=character_class=]
在括号表达式(使用
[
and编写
]
)中,
[=character_class=]
表示等价类。它匹配具有相同排序规则值的所有字符,包括它自己。例如,如果
o
和
(+)
是等价类的成员
[[=o=]]
,
[[=(+)=]]
、 和
[o(+)]
都是同义词。等价类不能用作范围的端点。
[:character_class:]
在括号表达式(使用
[
and编写
]
)中,
[:character_class:]
表示与属于该类的所有字符匹配的字符类。下表列出了标准类名。这些名称代表
ctype(3)
手册页中定义的字符类。特定的语言环境可能会提供其他类名。字符类不能用作范围的端点。
字符类名称
alnum
字母数字字符
alpha
blank
cntrl
digit
graph
lower
小写字母字符
print
图形或空格字符
punct
space
空格、制表符、换行符和回车
upper
大写字母字符
xdigit
十六进制数字字符
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