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

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

使用说明

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

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

转义字符的处理

在 SQL 语句中使用字符串常量时,如果包含反斜杠序列或元字符(如

\d
\d
\s
\s
*
*
?
?
),这些转义字符会被自动转义。例如,
SELECT '\\' AS col;
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
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
r
前缀,Lakehouse 简化了正则表达式的使用,使得文本匹配和数据处理更加直观和高效。

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