mysql 8.0 及以上版本支持 REGEXP_SUBSTR 函数,用于提取匹配正则的子串。语法为 REGEXP_SUBSTR(str, pattern, pos, occurrence, match_type),可指定起始位置和匹配次数。示例包括提取数字、邮箱、括号内容及特定前缀后的值,适用于文本清洗与数据提取场景。

MySQL 在 8.0 版本之后才引入了 REGEXP_SUBSTR 函数,用于从 字符串 中提取匹配 正则表达式 的子串。如果你使用的是 MySQL 8.0 或更高版本,就可以使用这个函数来实现灵活的文本提取。
基本语法
REGEXP_SUBSTR(str, pattern) 返回在字符串 str 中第一个匹配 正则表达式 pattern 的子串。如果没有匹配项,则返回 NULL。
常见用法示例
1. 提取数字 从字符串中提取连续的数字:
select REGEXP_SUBSTR(‘ 订单编号:12345,金额:678’, ‘[0-9]+’); 结果:12345(提取第一个数字序列)
2. 提取 邮箱 地址 假设字段包含一段文本,想提取其中的邮箱:
SELECT REGEXP_SUBSTR(‘ 联系方式:admin@example.com,电话:12345’, ‘[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}’); 结果:admin@example.com
3. 提取括号内的内容 提取圆括号中的文字:
SELECT REGEXP_SUBSTR(‘ 这是测试 (内部内容) 示例 ’, ‘([^)]+)’); 结果:(内部内容) 若想去掉括号,可结合其他函数处理。
4. 提取特定前缀后的值 比如提取 “ID:” 后面的数字:
SELECT REGEXP_SUBSTR(‘ 用户 ID:98765,状态:激活 ’, ‘ID:[0-9]+’); 结果:ID:98765 进一步提取纯数字可写成:
SELECT REGEXP_SUBSTR(‘ 用户 ID:98765,状态:激活 ’, ‘[0-9]+’, 1, 2); 这里第四个参数表示“第二次出现”,因为第一个数字可能是前面的编号。
支持起始位置和匹配次序(MySQL 8.0.4+)
REGEXP_SUBSTR(str, pattern, pos, occurrence, match_type) – pos:开始搜索的位置(默认为 1)– occurrence:第几次匹配(默认为 1)– match_type:匹配模式,如 ‘i’ 不区分大小写,’c’ 区分大小写,’m’ 多行模式等
示例:跳过第一个数字,提取第二个:
SELECT REGEXP_SUBSTR(‘ 价格:100 元,数量:5 个 ’, ‘[0-9]+’, 1, 2); 结果:5
注意事项
– 该函数在 MySQL 5.7 及更早版本中不可用。如果需要类似功能,可通过存储函数或程序端处理模拟。– 正则表达式不支持所有 PCRE 特性,使用时需遵循 MySQL 的正则语法(基于 Henry Spencer 的正则库)。– 若提取结果可能为空,建议配合 IFNULL 处理 NULL 值。
基本上就这些。合理使用 REGEXP_SUBSTR 能大幅提升文本 数据清洗 和提取效率,特别是在日志分析、数据导入等场景中非常实用。


