MySQL 正则表达式运算符与语法详解
本文详解 MySQL 中正则表达式的用法,涵盖 REGEXP、RLIKE 和 NOT REGEXP 三大核心操作符。深入解析 ^、$、.、*、+、[] 等常用特殊字符的匹配规则,结合 BINARY 处理大小写敏感问题及转义字符注意事项,帮助开发者高效实现复杂文本匹配。
概述
正则表达式是一种用于指定复杂搜索模式的强大工具。MySQL 采用基于 POSIX 1003.2 标准的 Henry Spencer 正则表达式实现,并进行了扩展以支持更丰富的功能。在处理包含换行符等控制字符时,需注意 MySQL 使用 C 语言风格的转义语法(如 \n),因此在 REGEXP 参数中,所有的反斜杠通常需要加倍处理。
正则表达式核心运算符
MySQL 主要提供三种正则匹配操作符:
- REGEXP / RLIKE:判断字符串是否匹配指定的正则模式。若匹配成功返回 1,不匹配返回 0,参数为空则返回 NULL。
- NOT REGEXP / NOT RLIKE:
REGEXP的逻辑否定。若不匹配返回 1,匹配返回 0。
-- 基本匹配示例:'.' 匹配任意字符(包括换行符) mysql> SELECT 'Michael!' REGEXP '.*'; +------------------------+ | 'Michael!' REGEXP '.*' | +------------------------+ | 1 | +------------------------+
在涉及二进制字符串或需要区分大小写的场景下,可使用 BINARY 关键字:
-- 默认情况下 'a' 匹配 'A' mysql> SELECT 'a' REGEXP 'A'; +----------------+ | 'a' REGEXP 'A' | +----------------+ | 1 | +----------------+ -- 使用 BINARY 强制区分大小写 mysql> SELECT 'a' REGEXP BINARY 'A'; +-------------------------+ | 'a' REGEXP BINARY 'A' | +-------------------------+ | 0 | +-------------------------+
注意: REGEXP 和 RLIKE 运算符按字节进行比较,这在多字节字符集环境下可能产生非预期结果。此外,对于带有重音符号的字符,其字节值可能与排序规则中的等效字符不同,导致匹配失败。
常用正则语法与构造
第1步:锚点定位与字符类基础
通过锚点和通配符精确控制匹配位置和内容:
^:匹配字符串开头。$:匹配字符串结尾。.:匹配除 NULL 之外的任何单个字符。
-- 匹配以 fo 开头的字符串 SELECT 'fofo' REGEXP '^fo'; -- 返回 1
第2步:量词重复匹配
定义字符出现的次数限制:
a*:匹配零个或多个 preceding 原子。a+:匹配一个或多个 preceding 原子。a?:匹配零个或一个 preceding 原子。{n}、{m,n}:精确匹配 n 次或在 m 到 n 次之间(范围需小于 255)。
-- 匹配 Ba 出现 0 次以上紧接着 n 的字符串 SELECT 'Ban' REGEXP '^Ba*n'; -- 返回 1 SELECT 'Baaan' REGEXP '^Ba*n'; -- 返回 1 SELECT 'Bn' REGEXP '^Ba+n'; -- 返回 0 (Ba+ 要求至少一个 a)
第3步:组合与选择结构
处理多序列逻辑:
|:表示“或”,匹配左侧或右侧的任一模式。(...):分组,可将整个组进行重复或选择。
-- 完全匹配 pi 或 apa SELECT 'pix' REGEXP '^(pi|apa)$'; -- 返回 0 SELECT 'apax' REGEXP '^(pi|apa)$'; -- 返回 0
第4步:字符集合与区间
利用方括号定义字符范围或排除特定字符:
[a-dX]:匹配 a、b、c、d 或 X。[^a-dX]:匹配不在范围内的任何字符。[[:class:]]:POSIX 标准字符类,如[[:digit:]]代表数字。
常用字符类包括:
| 类名 | 含义 |
|---|---|
alnum | 字母数字字符 |
alpha | 字母字符 |
blank | 空白字符(空格、制表符) |
digit | 十进制数字 |
space | 空格、制表符、换行等 |
-- 必须全为字母数字 SELECT 'justalnums' REGEXP '[[:alnum:]]+'; -- 返回 1 SELECT '!!' REGEXP '[[:alnum:]]+'; -- 返回 0
第5步:单词边界匹配
识别文本中的完整单词:
[[:<:]]:单词开始边界。[[:>:]]:单词结束边界。
-- 精确匹配中间的 word 单词 SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; -- 返回 1 SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; -- 返回 0
注意事项与转义技巧
由于 MySQL 查询解析器会先解释一次字符串,正则库再解释一次,因此若要匹配字面意义上的反斜杠 \ 或其他特殊字符(如 +),需在 SQL 中使用双反斜杠 \\ 进行转义。
-- 错误演示:+ 被解释为量词,导致 '1+2' 无法匹配 '12' mysql> SELECT '1+2' REGEXP '1+2'; -- 返回 0 -- 正确演示:转义 + 号本身 mysql> SELECT '1+2' REGEXP '1\\+2'; -- 返回 1
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













