SQL 方言通

首页 / 字符串

REGEXP_REPLACE 正则替换

REGEXP_REPLACE 用正则表达式查找并替换字符串。最大的差异在 Hologres:它沿用 PostgreSQL 的行为,默认只替换第一处匹配,要加 'g' 才会全部替换。各引擎的正则语法也不完全相同。

各引擎写法 · 迁移注意事项 · 示例

各引擎写法

引擎支持写法说明依据
MaxCompute 支持 REGEXP_REPLACE(source, pattern, replace_string[, occurrence]) occurrence 默认 0,表示替换全部匹配;传正数 N 只替换第 N 处。用 \1 引用分组。Hive 兼容模式用 Java 正则,1.0 和 2.0 类型系统用 MaxCompute 自己的正则规范。 官方文档
Hologres 支持 REGEXP_REPLACE(str, regex, replacement[, flags]) 使用 POSIX 正则。按 PostgreSQL 的定义,不加 flags 时只替换第一处匹配,flags 包含 g 时替换全部。 官方文档
StarRocks 支持 regexp_replace(str, pattern, repl) 示例显示会替换全部匹配,可以用 \1 引用分组。 官方文档
Doris 支持 REGEXP_REPLACE(str, pattern, repl) 替换全部匹配,正则语法参考 RE2,可以用 \1 引用分组。任一参数为 NULL 时返回 NULL。 官方文档
Hive 支持 regexp_replace(INITIAL_STRING, PATTERN, REPLACEMENT) 使用 Java 正则,替换全部匹配。 官方文档
Spark SQL 支持 regexp_replace(str, regexp, rep[, position]) Spark 1.5.0 起提供,使用 Java 正则,替换全部匹配。position 指定从第几个字符开始查找。 官方文档
Flink SQL 支持 REGEXP_REPLACE(string1, string2, string3) 替换全部匹配的子串。 官方文档

迁移注意事项

示例

去掉手机号中的横线

MaxCompute
SELECT REGEXP_REPLACE(phone, '-', '') FROM users;
Hologres
SELECT REGEXP_REPLACE(phone, '-', '', 'g') FROM users;
StarRocks
SELECT regexp_replace(phone, '-', '') FROM users;
Spark SQL
SELECT regexp_replace(phone, '-', '') FROM users;

同类函数

最后核对日期: