12.7.2 正则 table 达式

table12.13 正则 table 达式函数和运算符

NameDescription
NOT REGEXP否 REGEXP
REGEXP字符串是否匹配正则 table 达式
RLIKE字符串是否匹配正则 table 达式

正则 table 达式是为复杂搜索指定模式的有效方法。本节讨论可用于正则 table 达式匹配的运算符,并举例说明可用于正则 table 达式操作的一些特殊字符和构造。另请参见第 3.3.4.7 节“模式匹配”

MySQL 使用 Henry Spencer 的正则 table 达式实现,旨在实现 POSIX 1003.2. MySQL 使用扩展版本来支持 SQL 语句中的正则 table 达式模式匹配操作。本节不包含可以在 Henry Spencer 的regex(7)手册页中找到的所有详细信息。该手册页包含在 MySQL 源代码发布中,位于regex目录下的regex.7文件中。

正则 table 达式运算符

expr NOT REGEXP pat, expr NOT RLIKE pat

这与NOT (expr REGEXP pat)相同。

expr REGEXP pat, expr RLIKE pat

如果字符串* expr 与模式 pat 指定的正则 table 达式匹配,则返回 1,否则返回 0.如果 expr pat *为NULL,则返回值为NULL

RLIKEREGEXP的同义词。

模式可以是扩展的正则 table 达式,其语法在正则 table 达式语法中讨论。该模式不必是 Literals 字符串。例如,可以将其指定为字符串 table 达式或 table 列。

Note

由于 MySQL 在字符串中使用 C 转义语法(例如\ntable 示换行符),因此必须将在REGEXP参数中使用的任何\加倍。

在确定字符的类型并执行比较时,正则 table 达式操作使用字符集以及字符串 table 达式和模式参数的排序规则。如果参数具有不同的字符集或排序规则,则按照第 10.8.4 节“table 达式中的排序规则强制性”中的描述应用强制性规则。如果任一自变量是二进制字符串,则以区分大小写的方式将自变量作为二进制字符串处理。

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 |
+---------------------+
mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
+----------------+-----------------------+
| 'a' REGEXP 'A' | 'a' REGEXP BINARY 'A' |
+----------------+-----------------------+
|              1 |                     0 |
+----------------+-----------------------+

Warning

REGEXPRLIKE运算符以字节方式工作,因此它们不是多字节安全的,并且使用多字节字符集可能会产生意外的结果。此外,这些运算符按字节值比较字符,即使给定的归类将它们视为相等,重音字符也可能不相等。

正则 table 达式语法

正则 table 达式描述了一组字符串。最简单的正则 table 达式是其中没有特殊字符的 table 达式。例如,正则 table 达式hellohello匹配,其他都没有。

非平凡的正则 table 达式使用某些特殊的构造,以便它们可以匹配多个字符串。例如,正则 table 达式hello|world包含|交替运算符,并与helloworld匹配。

作为更复杂的示例,正则 table 达式B[an]*s匹配任何字符串BananasBaaaaasBs以及任何其他以B开头,以s结尾,且之间包含任意数量的an字符的字符串。

REGEXP运算符的正则 table 达式可以使用以下任何特殊字符和构造:

  • ^

匹配字符串的开头。

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+

匹配一个或多个a字符的任意序列。

mysql> SELECT 'Ban' REGEXP '^Ba+n';                     -> 1
mysql> SELECT 'Bn' REGEXP '^Ba+n';                      -> 0
  • a?

匹配零个或一个a字符。

mysql> SELECT 'Bn' REGEXP '^Ba?n';                      -> 1
mysql> SELECT 'Ban' REGEXP '^Ba?n';                     -> 1
mysql> SELECT 'Baan' REGEXP '^Ba?n';                    -> 0
  • de|abc

交替;与序列deabc匹配。

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}table 示法提供了一种更通用的方式来编写与该模式的前一个原子(或“件”)多次出现匹配的正则 table 达式。 * m n *是整数。

  • a*

可以写为a{0,}

  • a+

可以写为a{1,}

  • a?

可以写为a{0,1}

更精确地说,a{n}a的* n 个实例完全匹配。 a{n,}匹配 n a的更多实例。 a{m,n}匹配 m *至_10 的n 个实例(包括a)。如果同时给出 m n ,则 m 必须小于或等于 n *。

  • m n *必须在0RE_DUP_MAX的范围内(默认为 255)(包括 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]

匹配abcdX的任何字符(如果使用^,则不匹配)。其他两个字符之间的-字符形成一个范围,该范围与从第一个字符到第二个字符的所有字符匹配。例如,[0-9]匹配任何十进制数字。要包含 Literals]字符,它必须紧跟在左括号[之后。要包含 Literals-字符,必须先写入或最后写入。在[]对内没有定义特殊含义的任何字符都只会与自身匹配。

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.]

在方括号 table 达式(使用[]编写)中,匹配该整理元素的字符序列。 characters可以是单个字符,也可以是newline之类的字符名称。下 table 列出了允许的字符名称。

下 table 显示了允许的字符名称及其匹配的字符。对于以数字值形式给出的字符,这些值以八进制 table 示。

NameCharacterNameCharacter
NUL0SOH001
STX002ETX003
EOT004ENQ005
ACK006BEL007
alert007BS010
backspace'\b'HT011
tab'\t'LF012
newline'\n'VT013
vertical-tab'\v'FF014
form-feed'\f'CR015
carriage-return'\r'SO016
SI017DLE020
DC1021DC2022
DC3023DC4024
NAK025SYN026
ETB027CAN030
EM031SUB032
ESC033IS4034
FS034IS3035
GS035IS2036
RS036IS1037
US037space' '
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'~'
DEL177
mysql> SELECT '~' REGEXP '[[.~.]]';                     -> 1
mysql> SELECT '~' REGEXP '[[.tilde.]]';                 -> 1
  • [=character_class=]

在方括号 table 达式(使用[]编写)中,[=character_class=]table 示等价类。它匹配所有具有相同归类值的字符,包括自身。例如,如果o(+)是等效类的成员,则[[=o=]][[=(+)=]][o(+)]都是同义词。等效类不能用作范围的 endpoints。

  • [:character_class:]

在方括号 table 达式(使用[]编写)中,[:character_class:]table 示与属于该类的所有字符匹配的字符类。下 table 列出了标准的类名称。这些名称代 tablectype(3)手册页中定义的字符类。特定语言环境可能会提供其他类名称。字符类不能用作范围的端点。

角色类别名称Meaning
alnumAlphanumeric characters
alphaAlphabetic characters
blankWhitespace characters
cntrlControl characters
digitDigit characters
graphGraphic characters
lower小写字母字符
print图形或空格字符
punctPunctuation characters
space空格,制 table 符,换行符和回车符
upper大写字母字符
xdigit十六进制数字字符
mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+';       -> 1
mysql> SELECT '!!' REGEXP '[[:alnum:]]+';               -> 0
  • [[:<:]] , [[:>:]]

这些标记代 table 单词边界。它们分别匹配单词的开头和结尾。单词是单词字符的序列,不能在单词字符之前或之后。Literals 字符是alnum类中的字母数字字符或下划线(_)。

mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';   -> 1
mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';  -> 0

要在正则 table 达式中使用特殊字符的 Literals 实例,请在其前面加上两个反斜杠()字符。 MySQL 解析器解释一个反斜杠,而正则 table 达式库解释另一个反斜杠。例如,为了匹配包含特殊字符+的字符串1+2,只有以下正则 table 达式中的最后一个才是正确的:

mysql> SELECT '1+2' REGEXP '1+2';                       -> 0
mysql> SELECT '1+2' REGEXP '1\+2';                      -> 0
mysql> SELECT '1+2' REGEXP '1\\+2';                     -> 1