regexp_extract:正则提取
速查结论
regexp_extract(str, regexp[, idx]) 是 Spark SQL 中用于从字符串中提取匹配正则表达式的指定分组内容的函数。
语法
regexp_extract(str, regexp[, idx])
提取字符串 str 中第一个匹配正则表达式 regexp 并且对应于正则表达式组索引的字符串。
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| str | STRING | 要搜索的字符串表达式 |
| regexp | STRING | 正则表达式字符串(Java 正则表达式) |
| idx | INT | 可选。组索引(非负整数)。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 而非 0:
regexp_extract(str, regexp)默认提取第 1 个捕获组,要提取整个匹配内容需显式指定 idx = 0。
Since: 1.5.0
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

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