regexp_extract_all:正则全量提取
速查结论
regexp_extract_all(str, regexp[, idx]) 是 Spark SQL 中用于从字符串中提取所有匹配正则表达式的子字符串的函数。
语法
regexp_extract_all(str, regexp[, idx])
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| str | STRING | 需要提取的源字符串表达式 |
| regexp | STRING | 表示正则表达式的字符串,应为 Java 正则表达式 |
| idx | INT | 可选。表示要提取的正则表达式组索引,非负数。默认为 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真题
