首页/数据/SQL 速查/REGEXP_SUBSTR 与 regexp_match 提取匹配片段
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条
函数速查60 条
变更与事务52 条性能与执行计划72 条

REGEXP_SUBSTR 与 regexp_match 提取匹配片段

从文本中抽出符合模式的片段:解析日志行、提取 URL 参数、抓取编号;比 SUBSTRING 固定位置灵活得多。

SQL 速查数据更新于 2026-10-12

MySQL

MySQL
SELECT REGEXP_SUBSTR('order-2024-0678-x', '[0-9]{4}-[0-9]{4}');
-- '2024-0678'

PostgreSQL

PostgreSQL
-- regexp_match 返回捕获组数组(只匹配首处)
SELECT (regexp_match('order-2024-0678-x', '(\d{4})-(\d{4})'))[1];  -- '2024'
-- 只要整个匹配片段:
SELECT substring('order-2024-0678-x' from '\d{4}-\d{4}');        -- '2024-0678'
MySQLREGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])
PostgreSQLregexp_match 返回 text[](无匹配为 NULL);PG 15+ 提供 regexp_substr
无匹配MySQL 返回 NULL;regexp_match 返回 NULL

易错点

  • regexp_match 返回的是数组不是标量,直接放进 SELECT 列里会得到数组文本,需取 [1]
  • 正则匹配含贪婪量词时提取范围可能比预期长,用 [^/]+ 这类排除字符集而非 .*

数据来源与参考

  • MySQL 8.0 Reference Manual · Regular Expressions
  • PostgreSQL Documentation · Regular Expression Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌