添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
正则表达式是一种为复杂搜索指定模式的强大方法。本节讨论可用于正则表达式匹配的运算符,并通过示例说明一些可用于正则表达式运算的特殊字符和结构。另见 第 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