MySQL 正则表达式运算符与语法详解

不晚
不晚
发布时间:2026-10-15| 7人浏览过
原创

本文详解 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
以上就是 MySQL 字符串正则表达式的详细内容,更多关于 MySQL 高级查询技巧的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。