跳到主要内容

regexp_replace:正则替换

速查结论

regexp_replace(str, regexp, rep[, position]) 是 Spark SQL 中用于将字符串中所有匹配正则表达式的子字符串替换为指定内容的函数。

语法

regexp_replace(str, regexp, rep[, position])

参数说明

参数类型说明
strSTRING用于搜索正则表达式模式匹配的字符串表达式
regexpSTRING表示正则表达式的字符串,应为 Java 正则表达式
repSTRING用于替换匹配子字符串的字符串表达式
positionINT可选。一个正整数字面量,表示在 str 中开始搜索的位置。默认为 1。如果 position 大于 str 中的字符数,则结果是 str 原样返回

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

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

示例

> SELECT regexp_replace('100-200', '(\\d+)', 'num');
num-num

常见报错与避坑指南

  • 反斜杠转义层级:在 Spark SQL 字符串中,正则中的 \d 需要写成 \\d(两层转义:SQL 字符串层面和正则层面各一层)。如果转义不正确,正则不会按预期工作,但不会报错。
  • position 从 1 开始:position 参数表示从第几个字符开始替换,是从 1 开始计数。如果 position 大于字符串长度,直接返回原字符串,不会报错。
  • 全局替换regexp_replace 会替换所有匹配项,不仅仅是第一个。如果只想替换第一个匹配,需要使用更精确的正则模式。

Since: 1.5.0

📱关注公众号

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

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

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

交流微信二维码

你可能还想看