跳到主要内容

regexp_extract:正则提取

速查结论

regexp_extract(str, regexp[, idx]) 是 Spark SQL 中用于从字符串中提取匹配正则表达式的指定分组内容的函数。

语法

regexp_extract(str, regexp[, idx])

提取字符串 str 中第一个匹配正则表达式 regexp 并且对应于正则表达式组索引的字符串。

参数说明

参数类型说明
strSTRING要搜索的字符串表达式
regexpSTRING正则表达式字符串(Java 正则表达式)
idxINT可选。组索引(非负整数)。0 表示匹配整个正则表达式,默认为 1

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

有一个 SQL 配置 'spark.sql.parser.escapedStringLiterals',可以用来回退到 Spark 1.6 关于字符串文字解析的行为。例如,如果启用了此配置,可以匹配 "\abc" 的 regexp 是 "^\abc$"。

idx 参数是 Java 正则表达式 Matcher 组() 方法的索引。正则表达式可能包含多个组,idx 指示要提取哪个正则表达式组。idx 的最小值是 0,意味着匹配整个正则表达式。如果未指定 idx,则默认组索引值是 1。

示例

> SELECT regexp_extract('100-200', '(\\d+)-(\\d+)', 1);
100

常见报错与避坑指南

  • 无匹配时返回空字符串:当正则表达式未匹配到任何内容时,函数返回空字符串 '' 而非 NULL,在后续比较或计算中需要注意此行为。
  • idx 超出组数量:如果指定的 idx 大于正则表达式中实际的分组数量,函数返回空字符串 '',不会报错。
  • idx 默认值为 1 而非 0regexp_extract(str, regexp) 默认提取第 1 个捕获组,要提取整个匹配内容需显式指定 idx = 0。

Since: 1.5.0

📱关注公众号

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

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

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

交流微信二维码

你可能还想看