跳到主要内容

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,性能更好,可读性更高
  • 复杂正则匹配:用 rlikeregexp_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真题

交流微信二维码

你可能还想看