- 类别:
[ NOT ] REGEXP¶
执行比较以确定字符串是否与指定模式相匹配。两个输入都必须是文本表达式。
REGEXP 与 [ NOT ] LIKE 函数类似,但使用 POSIX 扩展的正则表达式而不是 SQL LIKE 模式语法。它支持比 LIKE 更复杂的匹配条件。
小技巧
您可以使用搜索优化服务,提高用于调用此函数的查询的性能。有关详细信息,请参阅 搜索优化服务。
- 别名:
[ NOT ] RLIKE (第 2 种语法)
另请参阅:字符串函数(正则表达式)
语法¶
<subject> [ NOT ] REGEXP <pattern>
实参¶
必填:
subject
以匹配为准。
pattern
要匹配的模式。
返回¶
返回 BOOLEAN 或 NULL。
指定 REGEXP 时,如果存在匹配项,则值为 TRUE。否则返回 FALSE。
指定 NOT REGEXP 时,如果没有匹配项,则值为 TRUE。否则返回 FALSE。
当指定 REGEXP 或 NOT REGEXP 时,如果任何实参为 NULL,则返回 NULL。
使用说明¶
该函数在两端隐式锚定一个模式(即
''
自动变为'^$'
,并且'ABC'
自动变为'^ABC$'
)。要匹配任何以 ABC 开头的字符串,模式将是'ABC.*'
。反斜杠字符 (
\
) 是转义字符。有关更多信息,请参阅 在以单引号括起的字符串常量中指定正则表达式。有关更多用法说明,请参阅 一般使用说明 了解正则表达式函数。
排序规则详细信息¶
Arguments with collation specifications are currently not supported.
示例¶
以下示例演示了如何将 REGEXP 与简单的通配符表达式一起使用:
创建表并加载数据:
CREATE OR REPLACE TABLE strings (v VARCHAR(50)); INSERT INTO strings (v) VALUES ('San Francisco'), ('San Jose'), ('Santa Clara'), ('Sacramento');使用通配符搜索模式:
SELECT v FROM strings WHERE v REGEXP 'San* [fF].*' ORDER BY v;+---------------+ | V | |---------------| | San Francisco | +---------------+
反斜杠字符 \
是正则表达式中的转义字符,用于指定特殊字符或字符组。例如,\s
是空格的正则表达式。
解析字面量字符串的 Snowflake 字符串解析器 也 将反斜杠视为转义字符。例如,反斜杠用作指定制表符的字符序列的一部分。因此,要创建包含单个反斜杠的字符串,必须指定 两个 反斜杠。例如,将以下输入语句中的字符串与输出中的相应字符串进行比较:
INSERT INTO strings (v) VALUES ('Contains embedded single \\backslash') ;SELECT * FROM strings ORDER BY v;+-------------------------------------+ | V | |-------------------------------------| | Contains embedded single \backslash | | Sacramento | | San Francisco | | San Jose | | Santa Clara | +-------------------------------------+
此示例演示如何搜索以“San”开头的字符串,其中“San”是一个完整的单词(例如,不是“Santa”的一部分)。\b
是字词边界的转义序列。
SELECT v, v regexp 'San\\b.*' AS MATCHES FROM strings ORDER BY v;+-------------------------------------+---------+ | V | MATCHES | |-------------------------------------+---------| | Contains embedded single \backslash | False | | Sacramento | False | | San Francisco | True | | San Jose | True | | Santa Clara | False | +-------------------------------------+---------+
此示例演示如何搜索后跟反斜杠的空格。请注意,要搜索的单个反斜杠由以下 四个 反斜杠表示;若要 REGEXP 查找字面量反斜杠,必须对该反斜杠进行转义,因此需要两个反斜杠。字符串解析器要求对每个反斜杠进行转义,因此表达式包含四个反斜杠来表示表达式正在搜索的一个反斜杠:
SELECT v, v regexp '.*\\s\\\\.*' AS MATCHES FROM strings ORDER BY v;+-------------------------------------+---------+ | V | MATCHES | |-------------------------------------+---------| | Contains embedded single \backslash | True | | Sacramento | False | | San Francisco | False | | San Jose | False | | Santa Clara | False | +-------------------------------------+---------+
下面的示例与前面的示例相同,只是它使用 $$
作为字符串分隔符来告知字符串分析器字符串是字面量,并且不应将反斜杠解释为转义序列。( REGEXP 仍将反斜杠解释为转义序列。)
SELECT v, v regexp $$.*\s\\.*$$ AS MATCHES FROM strings ORDER BY v;+-------------------------------------+---------+ | V | MATCHES | |-------------------------------------+---------| | Contains embedded single \backslash | True | | Sacramento | False | | San Francisco | False | | San Jose | False | | Santa Clara | False | +-------------------------------------+---------+