首页 / 字符串
RLIKE 正则匹配判断
RLIKE 判断字符串是否匹配正则表达式,只要有一段子串匹配就返回真。MaxCompute、Hive 和 Spark 支持 RLIKE 运算符;StarRocks、Doris 和 Flink 用 REGEXP 函数;Hologres 文档中没有对应的运算符,需要借助 REGEXP_MATCH。各引擎的正则语法和返回类型不同。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | A RLIKE B | 与 A REGEXP B 相同。B 为空串时报错,A 或 B 为 NULL 时返回 NULL。 | 官方文档 |
| Hologres | 需改写 | REGEXP_MATCH(str, pattern) IS NOT NULL | 字符串函数中没有 RLIKE。REGEXP_MATCH 在匹配时返回由分组组成的数组;未匹配时的返回值文档没有写明,建议实测。 | 官方文档 |
| StarRocks | 需改写 | regexp(expr, pattern) | 匹配返回 1,否则返回 0,任一参数为 NULL 时返回 NULL。 | 官方文档 |
| Doris | 需改写 | REGEXP(str, pattern) | 返回布尔值。默认使用 RE2 语法,不支持零宽断言;会话变量 enable_extended_regex 设为 true 后才支持。 | 官方文档 |
| Hive | 支持 | A RLIKE B | A 中任一子串匹配 Java 正则 B 时返回 TRUE,任一参数为 NULL 时返回 NULL。A REGEXP B 效果相同。 | 官方文档 |
| Spark SQL | 支持 | str RLIKE regexp | 使用 Java 正则。函数写法 rlike(str, regexp) 也可用;regexp 和 regexp_like 3.2.0 起提供,含义相同。 | 官方文档 |
| Flink SQL | 需改写 | REGEXP(string1, string2) | string1 中任一子串匹配 Java 正则 string2 时返回 TRUE,任一参数为 NULL 时返回 NULL。 | 官方文档 |
迁移注意事项
- RLIKE 是部分匹配,不是整串匹配。'foobar' RLIKE 'foo' 返回真;需要整串匹配时,要在正则两端加 ^ 和 $。
- StarRocks 的 regexp 返回 1 或 0,写在 WHERE 中可以直接用,但写入布尔列或与 true 比较时要注意类型。
- Doris 默认用 RE2 语法,不支持 (?=...) 这类零宽断言。从 Hive 或 Spark 的 Java 正则迁移时,要先确认是否用到这些写法。
- 反斜杠转义规则不同。Spark 文档说明字符串字面量会先被反转义,建议用 r 前缀的原始字符串;其他引擎请按各自的转义规则实测。
示例
筛选以 1 开头的 11 位手机号
SELECT phone FROM users WHERE phone RLIKE '^1[0-9]{10}$';SELECT phone FROM users WHERE REGEXP_MATCH(phone, '^1[0-9]{10}$') IS NOT NULL;SELECT phone FROM users WHERE regexp(phone, '^1[0-9]{10}$');SELECT phone FROM users WHERE REGEXP(phone, '^1[0-9]{10}$');SELECT phone FROM users WHERE phone RLIKE '^1[0-9]{10}$';SELECT phone FROM users WHERE phone RLIKE '^1[0-9]{10}$';SELECT phone FROM users WHERE REGEXP(phone, '^1[0-9]{10}$');