正则表达式支持的函数列表
函数 | 说明 |
---|
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简化了正则表达式的使用,使得文本匹配和数据处理更加直观和高效。