首页 / 字符串
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) |
替换全部匹配的子串。 | 官方文档 |
迁移注意事项
- Hologres 默认只替换第一处匹配。同样的 SQL 从 MaxCompute 迁过来,结果会只改掉第一处,需要补上第四个参数 'g'。
- 正则引擎不同:Hive 和 Spark 用 Java 正则,Doris 参考 RE2,Hologres 用 POSIX。RE2 不支持环视和模式中的反向引用,用到这些特性的正则迁到 Doris 后会报错。
- MaxCompute 的正则规范与 Java 不完全一致,开启 Hive 兼容模式后才使用 Java 正则,同一个模式在两种模式下结果可能不同。
- 字符串字面量中的反斜杠要转义。多数引擎写 '\\d' 表示 \d;Spark 还可以用 r'\d' 原始字符串。
示例
去掉手机号中的横线
SELECT REGEXP_REPLACE(phone, '-', '') FROM users;SELECT REGEXP_REPLACE(phone, '-', '', 'g') FROM users;SELECT regexp_replace(phone, '-', '') FROM users;SELECT regexp_replace(phone, '-', '') FROM users;