rlike:正则表达式匹配
速查结论
rlike(str, regexp) 是 Spark SQL 中用于正则表达式匹配的函数。当 str 匹配 regexp 正则模式时返回 true,否则返回 false。注意:自 Spark 2.0 起,SQL 解析器中的字符串字面量(包括正则表达式模式)不再进行转义,这与 Spark 1.6 的行为不同。简单字符串模式匹配请使用 LIKE。
语法
rlike(str, regexp)
参数说明
| 参数 | 说明 |
|---|---|
str | 待匹配的字符串表达式 |
regexp | 正则表达式字符串,使用 Java 正则表达式语法 |
返回值:如果 str 匹配 regexp 正则模式,返回 true;否则返回 false。任一参数为 NULL 时返回 NULL。
Since: 1.0.0
示例
基础正则匹配
-- 匹配以 'Spark' 开头的字符串
SELECT rlike('Spark SQL 3.x', '^Spark.*');
-- 结果: true
-- 匹配包含数字的字符串
SELECT rlike('hello123', '.*\\d+.*');
-- 结果: true
-- 不匹配
SELECT rlike('hello', '^\\d+$');
-- 结果: false
Spark 2.0+ 正则转义规则
自 Spark 2.0 起,SQL 解析器中字符串字面量不再进行转义。例如,要匹配 \abc,regexp 的正则表达式应为 ^\\abc$。
-- Spark 2.0+(默认行为)
SELECT rlike('%SystemDrive%\\Users\\John', '%SystemDrive%\\\\Users.*');
-- 结果: true
有一个 SQL 配置项 spark.sql.parser.escapedStringLiterals 可以回退到 Spark 1.6 的字符串字面量解析行为:
-- 启用旧版解析行为
SET spark.sql.parser.escapedStringLiterals=true;
SELECT rlike('%SystemDrive%\Users\John', '%SystemDrive%\\Users.*');
-- 结果: true
-- 恢复默认
SET spark.sql.parser.escapedStringLiterals=false;
rlike vs regexp_like vs like 对比
| 函数 | 用途 | 语法 | 适用场景 |
|---|---|---|---|
rlike(str, regexp) | 正则表达式匹配 | Spark SQL | 复杂模式匹配,如邮箱、手机号格式校验 |
regexp_like(str, regexp) | 正则表达式匹配 | ANSI SQL 标准 | 与 rlike 功能一致,跨引擎迁移首选 |
regexp(str, regexp) | 正则表达式匹配 | Spark SQL 别名 | 与 rlike 完全等价 |
LIKE | 简单通配符匹配 | SQL 标准 | 仅需 % 和 _ 通配符的简单匹配 |
-- rlike: 正则匹配(Spark SQL 风格)
SELECT rlike('user@example.com', '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$');
-- 结果: true
-- regexp_like: 正则匹配(ANSI SQL 标准)
SELECT regexp_like('user@example.com', '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$');
-- 结果: true
-- LIKE: 简单模式匹配
SELECT 'hello world' LIKE 'hello%';
-- 结果: true
选型建议:
- 简单通配符匹配:用
LIKE,性能更好,可读性更高 - 复杂正则匹配:用
rlike或regexp_like - 跨平台 SQL 兼容:用
regexp_like
常见报错与避坑指南
正则转义符混淆
这是最常见的错误:搞不清反斜杠在 SQL 字符串和正则表达式中的双重转义。
-- 错误写法:匹配数字用了 \d,但 SQL 中反斜杠需要转义
SELECT rlike('abc123', '\d+');
-- Spark 2.0+ 中,\d 被当作普通字符 d,不会匹配数字
-- 正确写法:在 Spark 2.0+ 中,正则中的反斜杠需要写两次
SELECT rlike('abc123', '\\d+');
-- 结果: true
正则中的特殊字符未转义
正则表达式中的特殊字符(如 .、*、+、?、|、(、)、[、])在需要匹配字面值时必须转义。
-- 错误写法:. 匹配任意字符,也会匹配到 '1.5'
SELECT rlike('1.5', '1.5');
-- 结果可能为 true,但也会匹配 '1X5'、'1a5' 等
-- 正确写法:用 \\. 转义点号,使其只匹配字面的点
SELECT rlike('1.5', '1\\.5');
-- 结果: true(只匹配数字.数字)
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

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