跳到主要内容

regexp_extract_all:正则全量提取

速查结论

regexp_extract_all(str, regexp[, idx]) 是 Spark SQL 中用于从字符串中提取所有匹配正则表达式的子字符串的函数。

语法

regexp_extract_all(str, regexp[, idx])

参数说明

参数类型说明
strSTRING需要提取的源字符串表达式
regexpSTRING表示正则表达式的字符串,应为 Java 正则表达式
idxINT可选。表示要提取的正则表达式组索引,非负数。默认为 1。idx=0 表示匹配整个正则表达式。idx 参数对应 Java 正则表达式 Matcher.group() 方法的索引

从 Spark 2.0 开始,SQL 解析器不再对字符串文字(包括正则表达式模式)进行转义。例如,要匹配 \abc,regexp 的正则表达式可以是 ^\abc$

有一个 SQL 配置 spark.sql.parser.escapedStringLiterals,可以用来回退到 Spark 1.6 关于字符串文字解析的行为。

示例

> SELECT regexp_extract_all('100-200, 300-400', '(\\d+)-(\\d+)', 1);
["100","300"]

常见报错与避坑指南

  • 组索引越界:如果 regexp 中定义了 2 个组(idx 分别为 1 和 2),但传入 idx=3,则会报 IndexOutOfBoundsException。请确保 idx 不超过正则表达式中定义的组数量。
  • 正则转义问题:在 Spark SQL 中写正则时,\d 需要写成 \\d。如果使用了 spark.sql.parser.escapedStringLiterals=true 配置,则转义规则不同,请注意区分。
  • 无匹配时返回空数组:如果字符串中没有匹配项,regexp_extract_all 返回空数组 [],不会返回 NULL。

Since: 3.1.0

📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

备注「数据仓库技术」加入社群,每日一道大厂SQL真题

交流微信二维码

你可能还想看