- 类别:
[ 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 |
+-------------------------------------+---------+