跳到主要内容

regexp:正则匹配

速查结论

regexp(str, regexp) 是 Spark SQL 中用于判断字符串是否匹配指定的正则表达式的函数。

语法

regexp(str, regexp)

如果 str 匹配 regexp,则返回真;否则返回假。

参数说明

参数类型说明
strSTRING要匹配的字符串表达式
regexpSTRING正则表达式字符串(Java 正则表达式)

从 Spark 2.0 开始,我们的 SQL 解析器不再对字符串文字(包括正则表达式模式)进行转义。例如,要匹配 "\abc",regexp 的正则表达式可以是 "^\abc$"。

有一个 SQL 配置 'spark.sql.parser.escapedStringLiterals',可以用来回退到 Spark 1.6 关于字符串文字解析的行为。例如,如果启用了此配置,可以匹配 "\abc" 的 regexp 是 "^\abc$"。

示例

> SET spark.sql.parser.escapedStringLiterals=true;
spark.sql.parser.escapedStringLiterals true
> SELECT regexp('%SystemDrive%\Users\John', '%SystemDrive%\\Users.*');
true
> SET spark.sql.parser.escapedStringLiterals=false;
spark.sql.parser.escapedStringLiterals false
> SELECT regexp('%SystemDrive%\\Users\\John', '%SystemDrive%\\\\Users.*');
true

提示:使用 LIKE 来匹配简单的字符串模式。

常见报错与避坑指南

  • 正则表达式转义差异:Spark 2.0 起默认不对字符串文字进行转义,正则中的反斜杠需要按实际需要书写。如需匹配字面反斜杠 \,在 regexp 中需写 \\(关闭 escapedStringLiterals 时需写 \\\\)。
  • 正则语法错误会直接报错:传入非法的正则表达式模式将导致运行时异常,而非返回 false。建议在开发阶段充分测试正则表达式。
  • 简单匹配优先使用 LIKE:对于不需要正则特性的简单字符串模式匹配(如前缀、后缀、包含),LIKEregexp 性能更好且可读性更强。

Since: 3.2.0

📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

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

交流微信二维码

你可能还想看