- 类别:
[ 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。 
使用说明¶
- The function implicitly anchors a pattern at both ends (for example, - ''automatically becomes- '^$', and- 'ABC'automatically becomes- '^ABC$'). For example, to match any string starting with- ABC, the pattern is- 'ABC.*'.
- 反斜杠字符 ( - \) 是转义字符。有关更多信息,请参阅 在以单引号括起的字符串常量中指定正则表达式。
- 有关更多使用说明,请参阅 一般使用说明,了解正则表达式函数。 
排序规则详细信息¶
Arguments with collation specifications currently aren't 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   |
+-------------------------------------+---------+