正则表达式支持的函数列表

函数说明
RLIKE用于检查一个字符串是否符合指定的正则表达式模式。
REGEXP_EXTRACT利用指定的正则表达式(regexp)从输入字符串(str)中提取匹配的文本。
REGEXP_EXTRACT_ALL用于从字符串中提取与正则表达式匹配的所有子串。
REGEXP_REPLACE用于在字符串 str 中查找所有匹配正则表达式 regexp 的子字符串,并将它们替换为指定的字符串 rep。

使用说明

Lakehouse使用的正则表达式引擎是re2

  • POSIX字符组:允许使用如[[:alnum:]]这样的字符组。
  • 反斜杠序列:包括\d(数字)、\D(非数字)、\s(空白字符)、\S(非空白字符)、\w(单词字符)、\W(非单词字符)、\b(单词边界)和\B(非单词边界)。
  • POSIX通配符:如.(匹配任意单个字符)和*(匹配前一个元素的零次或多次出现)。
  • Unicode支持:所有正则表达式函数均支持Unicode字符。

转义字符的处理

在SQL语句中使用字符串常量时,如果包含反斜杠序列或元字符(如\d\s*?),这些转义字符会被自动转义。例如,SELECT '\\' AS col;的输出将是\。对于表中实际存储的值为\\的情况,不会发生转义,只有字符串常量会经历这种转义。

因此,当编写需要匹配这些特殊序列的正则表达式时,需要添加额外的转义字符。例如:

-- 在字符串常量中,反斜杠序列会被自动转义
SELECT '\\\\' as col1, '\\' as col2;
+------+------+
| col1 | col2 |
+------+------+
| \\   | \    |
+------+------+
-- 如果在表中存储的是\\,则不会有自动转义的情况
CREATE TABLE test_regex(col STRING);
INSERT INTO test_regex VALUES('\\');
SELECT * FROM test_regex;
+-----+
| col |
+-----+
| \\  |
+-----+

使用正则表达式进行匹配时,需要对含有反斜杠序列或元字符的字符串进行转义:

SELECT col, RLIKE(col, '\\\\') FROM test_regex;
+-----+---------------------+
| col | RLIKE(col, '\\\\') |
+-----+---------------------+
| \\  | TRUE                |
+-----+---------------------+

字符串前缀 r 的使用

为了避免在不确定何时需要转义的情况下手动处理转义字符,Lakehouse支持在字符串前添加r前缀,表示字符串中的转义字符不会被转义,可以直接输入到正则表达式中运行。这样,用户可以像编写普通正则表达式一样,而不必担心SQL引擎的转译问题。例如:

-- 使用r前缀与表中的数据进行匹配
SELECT col, RLIKE(col, r'\\') FROM test_regex;
+-----+---------------------+
| col | RLIKE(col, '\\\\') |
+-----+---------------------+
| \\  | TRUE                |
+-----+---------------------+
-- 使用r前缀匹配字符串常量
SELECT RLIKE(r'%SystemDrive%\Users\John', r'%SystemDrive%\\Users.*') as res;
+------+
| res  |
+------+
| TRUE |
+------+
--不使用r前缀的正则匹配
SELECT r'%SystemDrive%\Users\John' rlike '%SystemDrive\\\\\Users.*';
+------+
| res  |
+------+
| true |
+------+

通过使用r前缀,Lakehouse简化了正则表达式的使用,使得文本匹配和数据处理更加直观和高效。

联系我们
预约咨询
微信咨询
电话咨询