SQL 方言通

首页 / 字符串

REGEXP_EXTRACT 正则提取

REGEXP_EXTRACT 用正则表达式匹配字符串,返回指定分组的内容。除 Hologres 外都同名可用,但分组参数是否必填、没有匹配时返回空字符串还是 NULL、正则语法和反斜杠转义都有差异。Hologres 要用 REGEXP_MATCH 加数组下标改写。

各引擎写法 · 迁移注意事项 · 示例

各引擎写法

引擎支持写法说明依据
MaxCompute支持REGEXP_EXTRACT(source, pattern[, group_id])group_id 默认为 1,为 0 时返回整个匹配。pattern 没有分组且不传 group_id 时会报错。Hive 兼容数据类型版本遵循 Java 正则规范,1.0 和 2.0 数据类型版本遵循 MaxCompute 自己的规范。官方文档
Hologres需改写(REGEXP_MATCH(str, pattern))[n]字符串函数中没有 REGEXP_EXTRACT。REGEXP_MATCH 返回由各分组组成的数组,再用数组下标取第 n 组,下标从 1 开始。官方文档
StarRocks支持regexp_extract(str, pattern, pos)pos 是必填参数。没有匹配时返回空字符串。官方文档
Doris支持REGEXP_EXTRACT(str, pattern, pos)pos 是必填参数。没有匹配时返回空字符串。默认使用 RE2 正则语法,不支持零宽断言;把会话变量 enable_extended_regex 设为 true 后才支持。官方文档
Hive支持regexp_extract(subject, pattern, index)签名中 index 是必填参数,含义与 Java Matcher.group() 的下标相同。文档提醒 '\s' 匹配的是字母 s,匹配空白要写 '\\s'。官方文档
Spark SQL支持regexp_extract(str, regexp[, idx])Spark 1.5.0 起提供。idx 默认为 1,为 0 时返回整个匹配。使用 Java 正则,字符串字面量会先被 SQL 解析器反转义,文档建议用 r 前缀的原始字符串,例如 r'(\d+)'。官方文档
Flink SQL支持REGEXP_EXTRACT(string1, string2[, integer])分组下标从 1 开始,0 表示整个匹配,下标不能超过定义的分组数。官方文档

迁移注意事项

示例

从 URL 参数中取 order_id

MaxCompute
SELECT REGEXP_EXTRACT(url, 'order_id=([0-9]+)', 1) AS order_id FROM access_log;
Hologres
SELECT (REGEXP_MATCH(url, 'order_id=([0-9]+)'))[1] AS order_id FROM access_log;
StarRocks
SELECT regexp_extract(url, 'order_id=([0-9]+)', 1) AS order_id FROM access_log;
Doris
SELECT REGEXP_EXTRACT(url, 'order_id=([0-9]+)', 1) AS order_id FROM access_log;
Hive
SELECT regexp_extract(url, 'order_id=([0-9]+)', 1) AS order_id FROM access_log;
Spark SQL
SELECT regexp_extract(url, 'order_id=([0-9]+)', 1) AS order_id FROM access_log;
Flink SQL
SELECT REGEXP_EXTRACT(url, 'order_id=([0-9]+)', 1) AS order_id FROM access_log;

同类函数

最后核对日期: